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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----移除有序链表中的重复节点

發(fā)布時間:2024/4/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----移除有序链表中的重复节点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Remove Duplicates from Sorted List

原題鏈接Remove Duplicates from Sorted List

給定一個有序鏈表,對于鏈表中所有重復(fù)元素,只保留一個,其余的都刪掉

因為鏈表是有序的,而且所有重復(fù)節(jié)點中只需要保留一個,所以假設(shè)上一個找到的節(jié)點是prev,當(dāng)前找到的節(jié)點是cur,那么只需要判斷cur->val和prev->val是否相等,即可判斷要不要將cur添加到結(jié)果鏈表中

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode* deleteDuplicates(ListNode* head) {ListNode* prev = head;ListNode* cur = head->next;while(cur){if(cur->val != prev->val){prev->next = cur;prev = cur;}cur = cur->next;}return head;} };

另一種方法,可以考慮

因為鏈表是有序的,相同的元素都集中在一起,所以只需要保留

  • 下一個節(jié)點是null的節(jié)點
  • 不重復(fù)的節(jié)點
  • 重復(fù)節(jié)點的最后一個節(jié)點

假設(shè)當(dāng)前節(jié)點為cur

判斷下一個節(jié)點是否是null的方法為

if(!cur->next)

判斷當(dāng)前節(jié)點不是重復(fù)節(jié)點或者是重復(fù)節(jié)點的最后一個節(jié)點的方法為

if(cur->val != cur->next->val)

代碼如下

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode* deleteDuplicates(ListNode* head) {ListNode* header = new ListNode(-1);header->next = head;ListNode* cur = head;ListNode* prev = header;while(cur){/* 最后一個節(jié)點或相同節(jié)點的最后一個 */if(!cur->next || cur->val != cur->next->val){prev->next = cur;prev = cur;}cur = cur->next;}head = header->next;delete header;return head;} };

Remove Duplicates from Sorted List II

原題鏈接Remove Duplicates from Sorted List II

仍然是去掉重復(fù)節(jié)點,但是重復(fù)節(jié)點一個都不保留

在上面的情況中,需要保留重復(fù)節(jié)點的最后一個節(jié)點,但是這里不需要保留,根據(jù)上面的解釋

if(cur->val != cur->next->val)

可以判斷當(dāng)前節(jié)點不是重復(fù)節(jié)點或者是重復(fù)節(jié)點的最后一個節(jié)點,所以為了拋出第二種情況,在進入條件后仍然需要再次判斷

可以通過一個變量記錄當(dāng)前節(jié)點是否是重復(fù)節(jié)點的最后一個節(jié)點,方法是如果

if(cur->val == cur->next->val)

那么cur->next可能就是重復(fù)節(jié)點的最后一個節(jié)點,只需要在前一次記錄即可

代碼如下

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode* deleteDuplicates(ListNode* head) {ListNode* header = new ListNode(-1);header->next = head;ListNode* cur = head;ListNode* prev = header;bool duplicate = false;while(cur){if(!cur->next || cur->val != cur->next->val){/* duplicate為false表示當(dāng)前節(jié)點不是重復(fù)節(jié)點 */if(duplicate == false){prev->next = cur;prev = cur;}else{duplicate = false;}}else{/* 令duplicate為true表示當(dāng)前節(jié)點是重復(fù)節(jié)點 */duplicate = true;}cur = cur->next;}prev->next = nullptr;head = header->next;delete header;return head;} };

這兩道題主要需要解決的是如何判斷重復(fù)節(jié)點,如果需要保留一個重復(fù)節(jié)點,那么每次遇到一個新節(jié)點就添加到結(jié)果中。如果不需要保留重復(fù)節(jié)點,那么就需要增加一層判斷條件,可以記錄這個節(jié)點是否是重復(fù)節(jié)點

總結(jié)

以上是生活随笔為你收集整理的每天一道LeetCode-----移除有序链表中的重复节点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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