剑指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;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
3月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
31 0
LeetCode第二十四题(两两交换链表中的节点)
|
3月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
48 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
57 0
|
5月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
61 5
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
7月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
7月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
66 2

热门文章

最新文章