//删除链表中重复节点--快慢指针

链表去重:利用快慢指针高效删除排序链表中的重复元素
该博客主要介绍了一种解决排序链表中重复元素问题的算法,使用快慢指针技巧。通过定义两个指针,快指针先走一步,当快指针遇到重复节点时,慢指针的下一个节点指向快指针的下一个节点,从而跳过重复部分。文章详细解释了算法逻辑,并提供了具体的代码实现,包括如何处理边界情况和头节点的特殊情况。

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

题目链接戳此

思路:定义快慢指针,快指针比慢指针多走一步,慢指针指向重复前的节点,当快指针碰到重复节点慢指针就不走了,快指针一直走到最后一个重复的节点上停下来,然后让慢指针的next指向快指针的next,快指针继续向后走一步,这样相对位置就又回到起始的时候了。注意如果是快指针走到头导致退出循环的话,就不能执行slow.next = fast.next这一步了,否则会删除最后一个节点,所以在退出循环后要判断退出循环的原因是走到头还是因为碰到重复节点。

细节:定义一个傀儡节点为头结点,这样如果链表中的第一个节点也重复了,就比较好删除头结点,最后返回的时候直接返回head.next就可以了。

代码实现如下:

public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null || pHead.next == null) return pHead;
        ListNode head = new ListNode(0);
        head.next = pHead;
        ListNode slow = head;
        ListNode fast = slow.next;
        while (fast != null) {
            while (fast.next != null && fast.val != fast.next.val) {
                slow = slow.next;
                fast = fast.next;
            } 
            while (fast.next != null && fast.val == fast.next.val) {
                fast = fast.next;
            }
            if (slow.next != fast) {
                slow.next = fast.next;
            }
            fast = fast.next;
        }
        return head.next;
    }
}

### 如何使用快慢指针删除链表中的重复节点 对于删除链表重复节点的任务,虽然传统方法可能不直接涉及快慢指针,但在特定情况下可以巧妙利用这一技术。通常的做法是通过哈希集合记录已经访问过的节点值,在遇到相同值时跳过该节点。然而,如果要严格遵循快慢指针的思想,则可以通过如下方式进行处理。 #### 方法概述 定义两个指针`fast`和`slow`,均初始化为链表头部。`fast`用于探测前方是否存在重复元素并向前推进,而`slow`负责构建无重复的新链表部分。每当发现新的唯一值时,更新`slow.next`指向当前唯一的`fast`所处的位置,并继续前进直到遍历结束[^1]。 #### 实现细节 为了确保操作的有效性和准确性: - 初始化阶段设置两个辅助指针- `while`循环控制整体流程直至到达列表末端; - 内部嵌套逻辑判断是否出现重复项以及相应处理措施; - 特殊情况考虑如空链表或单节点情形下的边界条件管理[^2]。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def deleteDuplicates(head: ListNode) -> ListNode: if not head or not head.next: return head slow = dummy = ListNode(0) fast = head seen_values = set() while fast: if fast.val not in seen_values: seen_values.add(fast.val) slow.next = fast slow = slow.next fast = fast.next slow.next = None # 断开与后续可能存在重复节点的连接 return dummy.next ``` 此代码片段展示了如何运用快慢指针配合哈希集合作为工具来移除链表内的冗余数据点[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值