題目描述
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
思路1:如果鏈表的長度爲n,倒數第k個節點,就是正着數的第(n-k+1)個節點。那麼先遍歷一遍,數一下鏈表的長度。然後走到正着數的那個節點就好。注意判斷,如果鏈表長度不夠k,那麼就沒有倒數第k個節點,返回None。如果頭指針爲空,那麼也直接返回None。這樣的思路是遍歷了兩遍的,能不能遍歷一遍呢?可以!
python題解:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
if head is None:
return None
pNode=head
count=1
while pNode.next:
pNode=pNode.next
count=count+1
if count<k:#不夠k個節點
return None
#倒數第k個節點是正數的第count-k+1個節點:
node=head
for i in range(1,count-k+1): #只循環正着數少1次就可以了
node=node.next
return node
思路2:遍歷一遍的方法,設立2個指針,第一個指針從鏈表的頭指針開始遍歷向前走k-1步,第二個指針保持不動;從第k步開始,第二個指針也開始從鏈表的頭指針開始遍歷。由於兩個指針的距離保持在k-1,當第一個指針到達鏈表的尾節點時,第二個指針正好指向倒數第k個節點。注意,由於k是無符號整數,如果k等於0的話,k-1就會變爲0xffffffff,後面會陷入無限循環,因此需要排雷。
C++題解:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead==nullptr||k==0){ //由於k是無符號整數,如果k等於0的話,k-1就會變爲0xffffffff,後面會陷入無限循環
return nullptr;
}
ListNode *pAhead=pListHead;
ListNode *pBehind=nullptr;
for(unsigned int i=0;i<k-1;i++){
if(pAhead->next!=nullptr)
pAhead=pAhead->next;
else
return nullptr; //如果節點個數小於k的話,就返回空指針就行,避免崩潰
} //頭指針先走k-1步
pBehind=pListHead;
while(pAhead->next!=nullptr){
pAhead=pAhead->next;
pBehind=pBehind->next;
}
return pBehind;
}
};