《劍指offer》 鏈表中倒數第k個節點
阿新 • • 發佈:2019-04-28
末尾 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個節點