牛客网-删除链表中重复的节点

简介: 牛客网-删除链表中重复的节点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

OJ链接:https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef

解法1 带头节点的解法

/*
 public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead){
        if(pHead == null)
            return pHead;
        //为了简单,构造一个有头结点的链表
        ListNode head = new ListNode(0);
        head.next = pHead;//带头节点的链表的next指向pHead,我们返回的时候就返回head.next即可
        //prev永远在last的前面
        ListNode prev = head;//前指针  目的:永远指向的是重复节点的前一个节点,为了方便删除
        ListNode last = prev.next;//后指针
        while(last!=null ){
            //1、,先找到重复的开始
            //如果last和last.next不相等,就一直让prev和last往后走
            while(last.next != null && last.val!= last.next.val){
                prev = prev.next;
                last = last.next;
            }
            //2、再找到重复的范围
            //如果last和last.next相等,就让last一直往后走,找和last.val相等的
            while(last.next != null && last.val == last.next.val){
                last=last.next;
            }
            //走到这里,结果一共有三种情况。注意:prev永远指向的是前驱有效起始节点:
            /*
            走到这里就构成了一个:(prev,last] 的区间
            1、last.next != null 并且prev到last是一段重复的范围,prev.next=last.next
            2、last.next == null 并且prev到last是一段重复的范围,prev.next=last.next(null)
            3、last.next == null 整张链表没有重复节点
            */
            if(prev.next != last){
                prev.next = last.next;
            }
            //走到这一步,就是为了保证恢复和最开始一致
            last = last.next;
        }
        //因为要把头节点给省略,所以这样做
        return head.next;
    }
}


目录
相关文章
|
13天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
12 0
LeetCode第二十四题(两两交换链表中的节点)
|
13天前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
32 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
5月前
|
存储 Python
链表中插入节点
链表中插入节点
|
6天前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
14 0
|
2月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
27天前
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
27天前
04_两两交换链表中的节点
04_两两交换链表中的节点
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
48 5
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
38 4
|
3月前
|
安全 云计算
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
43 2