1. 程式人生 > >【LeetCode & 劍指offer刷題】鏈表題4:22 刪除鏈表中倒數第k個結點(19. Remove Nth Node From End of List)

【LeetCode & 劍指offer刷題】鏈表題4:22 刪除鏈表中倒數第k個結點(19. Remove Nth Node From End of List)

star urn n+1 valid ffffff 防禦性編程 normal move rgb

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

19. Remove Nth Node From End of List

Given a linked list, remove the n-th node from the end of list and return its head. Example: Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes
1->2->3->5. Note: Given n will always be valid. Follow up: Could you do this in one pass? /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /*方法:雙指針法,前面的指針比後面的領先n+1步,往前走,直到前面的指針到達末尾結點,所要信息,可以從落後的指針獲取
如果只是查找倒數第n個結點,可以只用領先n步即可 fast領先n+1步, fast到nullptr,slow到達倒數n+1位置 刪除倒數n位置結點即可 (prehead的使用) */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { //防禦性編程 if(head == nullptr || n == 0) return head; ListNode prehead(0); //創建頭結點,方便處理只有一個結點或者移除首結點的特殊情況
prehead.next = head; //指向首結點 ListNode* fast = &prehead, *slow = &prehead; //fast領先n+1步,循環退出時,fast在位置n+1,slow在位置0(prehead位置為0) for(int i = 1; i<=n+1; i++) { fast = fast->next; // if(fast == nullptr) return nullptr; //對於查找,需要處理如果n小於鏈表長度的情況 } //同時移動fast和slow while(fast != nullptr) { fast = fast->next; slow = slow->next; } //結果為fast指向最後一個結點之後為nullptr,slow指向倒數第(n+1)個結點 (找到倒數第n+1個結點,方便刪除下一個結點) ListNode* temp = slow->next; //倒數第n個結點 slow->next = slow->next->next; //跳過倒數第n個結點 delete temp; //刪除倒數第n個結點 return prehead.next; } }; /* 方法二 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(head == NULL || n <= 0) return head; if(head->next == NULL) return NULL; ListNode *p1 = head, *p2 = head; while(n > 0) { p1 = p1->next; n --; } if(p1 == NULL) // 要刪除的為head節點 { head = head->next; delete p2; return head; } ListNode *pre = head; while(p1 != NULL) { pre = p2; p1 = p1->next; p2 = p2->next; } pre->next = p2->next; delete p2; return head; } }; */

【LeetCode & 劍指offer刷題】鏈表題4:22 刪除鏈表中倒數第k個結點(19. Remove Nth Node From End of List)