Skip to content

Latest commit

 

History

History
60 lines (60 loc) · 1.91 KB

lc-82.md

File metadata and controls

60 lines (60 loc) · 1.91 KB

题目链接: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;
    }
};