日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用 哑节点(dummy node),高效解决问题

發(fā)布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用 哑节点(dummy node),高效解决问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

前言:

1.19. 刪除鏈表的倒數(shù)第 N 個結點

?2.24. 兩兩交換鏈表中的節(jié)點

3.82. 刪除排序鏈表中的重復元素 II


前言:

在對鏈表進行操作時,一種常用的技巧是添加一個啞節(jié)點(dummy node),它的 next 指針指向鏈表的頭節(jié)點。這樣一來,我們就不需要對頭節(jié)點進行特殊的判斷了,可省去許多麻煩。

1.19. 刪除鏈表的倒數(shù)第 N 個結點

問題描述:

思路:

先求出鏈表長度,后找到要被刪除節(jié)點的前一個節(jié)點。第二次遍歷是是從啞巴節(jié)點開始的。

代碼:

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));//創(chuàng)建啞巴節(jié)點dummy->val = 0, dummy->next = head;int length = getLength(head);//求出鏈表長度struct ListNode* cur = dummy;int k=length-n;while(k--)//找到要被刪除節(jié)點的前一個節(jié)點{cur=cur->next;}cur->next = cur->next->next;return dummy->next }

?2.24. 兩兩交換鏈表中的節(jié)點

?描述:

?思路:

創(chuàng)建啞結點 dummyHead,令 dummyHead->next = head。cur 表示當前到達的節(jié)點,初始時 cur = dummyHead。每次需要交換 cur后面的兩個節(jié)點.

若cur后面存在兩個節(jié)點,將兩個節(jié)點設為?node1?和?node2。

cur -> node1 -> node2變?yōu)?---?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

思路:

由于鏈表的頭節(jié)點可能會被刪除,因此我們需要額外使用一個啞節(jié)點(dummy node)指向鏈表的頭節(jié)點。初始時,令cur=dummy node。如果cur后面兩個節(jié)點的值相同(記為A),cur的next指向下個節(jié)點,直到cur->next節(jié)點的值不為A。如果cur后面連續(xù)兩個節(jié)點的值不同,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后面兩個節(jié)點的值相同,cur的next指向下個節(jié)點{int x = cur->next->val;while (cur->next && cur->next->val == x){cur->next = cur->next->next;}}else {cur = cur->next;//cur后面連續(xù)兩個節(jié)點的值不同,cur往后遍歷}}return dummy->next; }

通過這三個題目練習,可以更好的運用啞節(jié)點處理頭節(jié)點要變更的題目

總結

以上是生活随笔為你收集整理的如何使用 哑节点(dummy node),高效解决问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。