1. 程式人生 > >《劍指offer》 鏈表中倒數第k個節點

《劍指offer》 鏈表中倒數第k個節點

末尾 head 輸入參數 指針 劍指offer 同時 none Coding sig

本題來自《劍指offer》 鏈表中倒數第k個節點

題目:

  輸入一個鏈表,輸出該鏈表中倒數第k個結點。

思路:

  倒數第k個節點,而且只能訪問一遍鏈表,定義兩個節點,兩者之間相差k個距離,遍歷到尾節點,則便找到了倒數k節點了。

  考慮代碼的魯棒性。代碼的魯棒是指程序能夠判斷輸入是否合乎規範要求,並對不合理的輸入給予合理的處理。

  1.如果傳入的根節點是空:直接返回空

  2.傳入的數據少於k個:在遍歷前k個節點時候,如果發現為空,則直接返回空

  3.傳入的k為小於或者等於0:直接返回空

  4.正常的數據,first和second兩者相隔k,依次遍歷

C++ Code:

/*
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 || k<=0){            //魯棒性檢測,如果頭指針為空或者k小於0直接返回空
return NULL; } ListNode* first = pListHead; ListNode* second = pListHead; for (int i=0;i<k;i++){ //第二個節點和第一個節點相隔k個距離 if (!second){ return NULL; } second = second->next; }
while (second){ //第一個和第二個節點依次遍歷,直到尾節點為止 first = first->next; second = second->next; } return first; //第一個節點便是倒數第k個節點 } };

Python Code:

# -*- 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 not head or k <=0 :        #如果head為空或者k小於0,直接返回空
            return None
        first,second = head,head
        for i in range(k):         #第二個指針和第一個指針相差k個距離
            if not second :            #考慮,如果個數都小於k,則直接返回空
                return None
            second = second.next
        while second:              #兩者同時遍歷,直到道尾節點
            first = first.next
            second = second.next
        return first               #第一個節點就是倒數k個節點了
    

總結:

  要考慮輸入參數的魯棒性,輸入可能取得所有值,比如邊界值,要考慮這些值的處理方法。

類似題目:

  A.求鏈表的中間節點:如果鏈表的中間節點總數為奇數,返回中間節點,如果為偶數,返回中間的其中一個。

    定義兩個節點,第一個節點first一次跨一步。

    第二個節點second一次跨兩步,當該節點是尾節點時候,剛好第一個節點是中間節點。

  B.判斷一個鏈表是否形成了環形節點

    同上,定義兩個指針,慢指針一次跨一步,快的指針一次跨兩步,如果快的趕上了慢的,則表明是環形,如果快的指針走到了鏈表的末尾即為空,則表明不是環形鏈表。

《劍指offer》 鏈表中倒數第k個節點