如何使用 哑节点(dummy node),高效解决问题
目錄
前言:
1.19. 刪除鏈表的倒數第 N 個結點
?2.24. 兩兩交換鏈表中的節點
3.82. 刪除排序鏈表中的重復元素 II
前言:
在對鏈表進行操作時,一種常用的技巧是添加一個啞節點(dummy node),它的 next 指針指向鏈表的頭節點。這樣一來,我們就不需要對頭節點進行特殊的判斷了,可省去許多麻煩。
1.19. 刪除鏈表的倒數第 N 個結點
問題描述:
思路:
先求出鏈表長度,后找到要被刪除節點的前一個節點。第二次遍歷是是從啞巴節點開始的。
代碼:
int getLength(struct ListNode* head) {int length = 0;while (head) {++length;head = head->next;}return length; } struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode* dummy = malloc(sizeof(struct ListNode));//創建啞巴節點dummy->val = 0, dummy->next = head;int length = getLength(head);//求出鏈表長度struct ListNode* cur = dummy;int k=length-n;while(k--)//找到要被刪除節點的前一個節點{cur=cur->next;}cur->next = cur->next->next;return dummy->next }?2.24. 兩兩交換鏈表中的節點
?描述:
?思路:
創建啞結點 dummyHead,令 dummyHead->next = head。cur 表示當前到達的節點,初始時 cur = dummyHead。每次需要交換 cur后面的兩個節點.
若cur后面存在兩個節點,將兩個節點設為?node1?和?node2。
cur -> node1 -> node2變為----?cur->node2 -> node1,再將cur置為node1。再重復以上操作
代碼:
struct ListNode* swapPairs(struct ListNode* head){if(head==NULL||head->next==NULL){return head;}struct ListNode*dummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));dummyHead->next=head;struct ListNode*cur=dummyHead;while(cur->next&&cur->next->next){ struct ListNode* Node1 = cur->next;struct ListNode* Node2 =cur->next->next;cur->next=Node2;Node1->next=Node2->next;Node2->next=Node1;cur=Node1;}return dummyHead->next; }3.82. 刪除排序鏈表中的重復元素 II
思路:
由于鏈表的頭節點可能會被刪除,因此我們需要額外使用一個啞節點(dummy node)指向鏈表的頭節點。初始時,令cur=dummy node。如果cur后面兩個節點的值相同(記為A),cur的next指向下個節點,直到cur->next節點的值不為A。如果cur后面連續兩個節點的值不同,cur往后遍歷
如圖:
代碼:
struct ListNode* deleteDuplicates(struct ListNode* head){struct ListNode* dummy = malloc(sizeof(struct ListNode));dummy->next = head;struct ListNode* cur = dummy;while (cur->next && cur->next->next){if (cur->next->val == cur->next->next->val)//如果cur后面兩個節點的值相同,cur的next指向下個節點{int x = cur->next->val;while (cur->next && cur->next->val == x){cur->next = cur->next->next;}}else {cur = cur->next;//cur后面連續兩個節點的值不同,cur往后遍歷}}return dummy->next; }通過這三個題目練習,可以更好的運用啞節點處理頭節點要變更的題目
總結
以上是生活随笔為你收集整理的如何使用 哑节点(dummy node),高效解决问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聚石塔服务器系统盘在线扩容
- 下一篇: IOS7.1.2越狱手工美化(字体,状态