AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

手撕代码锻炼 82. 删除排序链表中的重复元素 II

作者: 作者的头像   liweidong ,  2023-03-19 22:02:11 ,  所有人可见 ,  阅读 38


0


1

/*
 * dummy
 * 遍历所有节点t
 * p = t->next, q = p->next, q开始往下走,直到值与p不同
 * 如果p = q, t变为p
 * 如果p != q, 删除[p, q]节点
 */
#include <iostream>
#include <vector>
using namespace std;

struct Node{
    int val;
    Node* next;
    Node(int x = -1): val(x), next(nullptr) {}
};

Node* deleteRepeatedNode(Node* head){
    // 为了避免边界问题,在链表前边接一个空节点
    Node* dummy = new Node;
    dummy->next = head;
    Node* h = dummy;

    // 遍历所有结点
    while(h->next){
        Node* p = h->next; // 下一个节点
        Node* q = p->next; // 下下个节点
        // 遍历从q开始所有与p值相同的节点
        while(q && q->val == p->val) q = q->next;

        // 不存在重复节点
        if(p->next == q) h = p;
        // 存在重复节点
        else h->next = q;
    }
    return dummy->next;
}

int main(){

    // 构建链表
    vector<int> nums{1,1,1,2,3};
    Node* dummy = new Node;
    Node* p = dummy;
    for(int x : nums){
        p->next = new Node(x);
        p = p->next;
    }
    Node* head = dummy->next;
    delete dummy;


    Node* res = deleteRepeatedNode(head);
//    Node* res = head;

    // 打印
    p = res;
    while(p){
        cout<<p->val<<" ";
        p = p->next;
    }
    cout<<endl;

    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息