每天一道LeetCode-----移除有序链表中的重复节点
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----找出给
- 下一篇: 每天一道LeetCode-----从有序