题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
咳咳咳咳,好久没写过链表这种东西了,发现还是有点搞的
这种要遍历整个链表再做修改返回的,需要维护一个新的头结点,然后解放一个节点去做一些操作。
先放一个链表的常见结构:
struct ListNode{
double val;
ListNode* next;
};
而声名一个新的列表节点(带值)的方式是:
new ListNode(val);
那么回到问题本身,题目要求只要有重复值的节点就通通删掉,不过给出的链表数值保证了升序,所以只需要一次遍历就行了。
p = new ListNode(0);
p->next = head;
head = p;
首先新建一个节点,让他指向head,这样就可以通过p访问所有链表元素,把head指向p备用
接着就要考虑遍历的问题,这里删除重复元素的思路是直接修改后继节点,将前面重复的节点通通扔掉。
//假设cur指向最后一个重复元素
p->next = cur->next
否则,将p往后挪(不做任何操作,原有链表被保留) 完整代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *p = new ListNode(0);
ListNode *pred,*cur;
p->next = head;
head = p;
while(p->next){
pred = p->next;
cur = p;
while(cur->next && cur->next->val==pred->val){
cur = cur->next;
}
if(cur==pred) p = cur;
else
p->next = cur->next;
}
return head->next;
}
};