首页 > 代码库 > leetcode[82] Remove Duplicates from Sorted List II
leetcode[82] Remove Duplicates from Sorted List II
给定一个有序链表,删除相同值的节点。例如
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
我是新建一个ans链表,来存链表中distinct的值。不知道这样符合要求不。
判断当前的值不等于前面一个也不等于后面一个那么就是符合条件的节点之一。
/** * 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) { if (head == NULL || head->next == NULL) return head; ListNode *ans = new ListNode(0); ListNode *pre = ans; ListNode *now = head->next; ListNode *last = head; if (now && now->val != last->val) // 第一次要先判断,因为now从第二个节点开始 { ListNode *tmp = new ListNode(last->val); pre->next = tmp; pre = pre->next; } while(now) { if ((now -> next == NULL || now->next && now->val != now->next->val) && now->val != last->val) { ListNode *tmp = new ListNode(now->val); pre->next = tmp; pre = pre->next; now = now->next; last = last->next; continue; } now = now->next; last = last->next; } head = ans->next; delete(ans); return head; }};
因为我是另外开辟的,所以我还看了原链表中操作的。这个不错:
用pre和now去删除节点,由于头节点也有可能删除,因此先建一个Head节点连头节点。
pre从Head开始,用now去判断是否重复。
如果重复,循环到下一个不同元素之前,把之间的相同元素直接跳过。
再向前移动pre和now指针。
/** * 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 *pre,*now,*Head; if(!head||!head->next)return head; Head=new ListNode(-1); Head->next=head; pre=Head; now=head; while(now&&now->next) { if(now->val == now->next->val) { while(now->next && now->val == now->next->val) { now=now->next; } pre->next=now->next; now=now->next; } else { pre=now; now=now->next; } } head=Head->next; delete(Head); return head; }};
leetcode[82] Remove Duplicates from Sorted List II
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。