【第一部分】10Leetcode刷題
阿新 • • 發佈:2019-03-27
ast image etc return pan 結點 node rem color
一、刪除鏈表的倒數第N個節點
題目:19. Remove Nth Node From End of List
分析:典型的利用雙指針法解題。首先讓指針first指向頭節點,然後讓其向後移動n步,接著讓指針sec指向頭結點,並和first一起向後移動。當first的next指針為NULL時,sec即指向了要刪除節點的前一個節點,接著讓first指向的next指針指向要刪除節點的下一個節點即可。註意如果要刪除的節點是首節點,那麽first向後移動結束時會為NULL,這樣加一個判斷其是否為NULL的條件,若為NULL則返回頭結點的next指針。
環形鏈表
題目:141. Linked List Cycle
解法一:
1 class Solution { 2 public: 3 bool hasCycle(ListNode *head) 4 { 5 ListNode *slow = head, *fast = head; 6 while (fast && fast->next) 7 { 8 slow = slow->next; 9 fast = fast->next->next; 10 if(slow == fast) return true; 11 } 12 return false; 13 } 14 };
二、環形鏈表 II
題目:142. Linked List Cycle II
如下圖所示,X,Y,Z分別為鏈表起始位置,環開始位置和兩指針相遇位置,則根據快指針速度為慢指針速度的兩倍,可以得出:
2*(a + b) = a + b + n * (b + c);即:a=(n - 1) * b + n * c = (n - 1)(b + c) +c; 註意到b+c恰好為環的長度,故可以推出,如將此時兩指針分別放在起始位置和相遇位置,並以相同速度前進,當一個指針走完距離a時,另一個指針恰好走出 繞環n-1圈加上c的距離。故兩指針會在環開始位置相遇。解法一:
1 class Solution { 2 public: 3 ListNode *detectCycle(ListNode *head) 4 { 5 if (head == NULL || head->next == NULL) 6 return NULL; 7 ListNode * p = head; 8 ListNode * q = head; 9 while (q != NULL && q->next != NULL)//第一次pq相遇 10 { 11 p = p->next; 12 q = q->next->next; 13 if (p == q) break; 14 } 15 16 if (p == q) 17 { 18 p = head; 19 while (p != q)//從起點開始,在入口點相遇 20 { 21 p = p->next; 22 q = q->next; 23 } 24 return p; 25 } 26 return NULL; 27 } 28 };
【第一部分】10Leetcode刷題