22.鏈表中倒數第K個節點

題目描述

輸入一個鏈表,輸出該鏈表中倒數第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;
    
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章