剑指offer 17. 删除链表中重复的节点

简介: 剑指offer 17. 删除链表中重复的节点

题目描述

在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。

数据范围

链表中节点 val 值取值范围 [0,100]。

链表长度 [0,100]。


样例1

输入:1->2->3->3->4->4->5
输出:1->2->5


样例2

输入:1->1->1->2->3
输出:2->3



方法一:线性扫描 O(n)

这题我们可以创建一个新的头结点出来,方便我们去处理后续结点。但是,我们下面演示操作的时候是直接在链表上进行处理,这样大家能够看得更清楚一些。


然后我们分两种情况来讨论,分别是出现重复结点的情况和无重复结点的情况。


情况一: 出现重复结点时,我们会用一个指针 q 去找到下一个值。


7d6d0418642a41cb9a7e2c719552c0e0.png

可以用 while 循环进行查找,找到直到与 p->next 的值不同为止。

情况二: 当前遍历的是不重复的结点,还是进行同样的判断操作。



73f6cfb58c4c48e2a5151b7179365358.png


由于没有重复的元素, q 经过 while 循环后只会向后移一位。所以 p->next->next 就是 q ,故直接将 p 往后移一位即可。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplication(ListNode* head) {
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        ListNode* p = dummy;
        while (p->next)
        {
            ListNode* q = p->next;
            while (q && p->next->val == q->val)  q = q->next;
            if (p->next->next == q)    p = p->next; //没有重复元素
            else    p->next = q;  //有重复元素
        }
        return dummy->next;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
16天前
|
算法
【优选算法专栏】专题九:链表--------两两交换链表中的节点
【优选算法专栏】专题九:链表--------两两交换链表中的节点
17 0
|
1月前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
1月前
《剑指offer》——从尾到头打印链表
《剑指offer》——从尾到头打印链表
|
1月前
leetcode2487.从链表中移除节点
leetcode2487.从链表中移除节点
20 1
|
1月前
|
C语言
【C语言】Leetcode 876. 链表的中间节点
【C语言】Leetcode 876. 链表的中间节点
15 0
|
1月前
|
设计模式 测试技术
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
21 1
|
2月前
|
算法
《剑指offer》之从“尾到头打印链表”题解
《剑指offer》之从“尾到头打印链表”题解
14 2
|
2月前
|
Java
LeetCode题解- 两两交换链表中的节点-Java
两两交换链表中的节点-Java
13 0
|
1月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
1月前
|
存储
LeetCode刷题---817. 链表组件(哈希表)
LeetCode刷题---817. 链表组件(哈希表)