首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

删除单链表中的循环

删除单链表中的循环是一个经典的编程问题,通常需要使用快慢指针的方法来解决。以下是一个完整的解决方案:

  1. 定义两个指针,一个快指针(fast)和一个慢指针(slow),同时将它们都指向链表的头节点。
  2. 快指针每次移动两个节点,慢指针每次移动一个节点,直到快指针到达链表的尾部。
  3. 如果链表中存在循环,那么快指针最终会追上慢指针,并且它们会相遇。如果链表中不存在循环,那么快指针会到达链表的尾部,此时链表中不存在循环。
  4. 如果快指针和慢指针相遇,那么我们可以将慢指针重新指向链表的头节点,并且让它和快指针同时每次移动一个节点,直到它们再次相遇。
  5. 当它们再次相遇时,这个节点就是循环的开始节点。我们可以从这个节点开始,将循环中的所有节点删除。

以下是一个 Python 代码示例:

代码语言:python
复制
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def delete_loop(head):
    slow = head
    fast = head

    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

        if slow == fast:
            fast = head
            while fast != slow:
                fast = fast.next
                slow = slow.next

            fast.next = None
            break

    return head

这个代码中,我们定义了一个 ListNode 类来表示链表节点,并且定义了一个 delete_loop 函数来删除链表中的循环。在函数中,我们使用快慢指针的方法来找到循环的开始节点,并将其删除。

需要注意的是,这个代码只能删除单链表中的循环,如果链表中存在多个循环,那么只能删除其中一个。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

链表问题】删除链表第K个节点

前言 以专题形式更新刷题贴,欢迎跟我一起学习刷题。每道题会提供简单解答。 【题目描述】 在链表删除倒数第 K 个节点。...【要求】 如果链表长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1) 【难度】 士 【解答】 删除时候会出现三种情况: 1、不存在倒数第 K 个节点,此时不用删除。...所以我们可以用一个变量 num 记录链表一共有多少个节点。 如果 num < K,则属于第一种情况。 如果 num == K,则属于第二情况。...如果 num > K, 则属于第三种情况,此时删除倒数第 K 个节点等价于删除第 (num - k + 1) 个节点。...(num-k+1)个节点 //定位到这个点前驱 while (num - K !

1.7K10

链表问题】删除链表中间节点

【题目描述】 给定链表头节点head,实现删除链表中间节点函数。   ...例如:   步删除任何节点;   1->2,删除节点1;   1->2->3,删除节点2;   1->2->3->4,删除节点2;   1->2->3->4-5,删除节点3; 【要求】 如果链表长度为...slow.next = slow.next.next; return head; } 上次那道删除倒数第 K 个节点题(【链表问题】删除链表第K个节点) 其实也是可以使用双指针...问题拓展 题目:删除链表 a / b 处节点 【题目描述】   给定链表头节点 head、整数 a 和 b,实现删除位于 a/b 处节点函数。   ...例如:   链表:1->2->3->4->5,假设 a/b 值为 r。

81140

数据结构(05)_链表01(链表、静态链表、单向循环链表

链式存储结构逻辑结构:   1.2.链表   链表节点定义: 注意:这里struct是用来定义一个类,与class访问属性相反,默认为public链表内部结构:头节点在链表意义是...:辅助数据元素定位,方便插入和删除,因此,头节点不存储实际数据。   ...1.3.链表插入与删除:   插入:    node->value = e; node->next = current->next; Current->next = node...;   删除:    toDel = current->next; current->next = toDel->nex; delete toDel;   2.链表实现...解决方案:头节点构造时单向循环链表,避免调用泛指类型构造函数,也即是说要自定义头节点类型,并且该类型是一个匿名类型    mutable struct : public Object

22810

链表(无头单项非循环

前言 链表是一种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表指针链接次序实现链表形式有很多,本篇文章主要介绍链表且无头结点。...在严版数据结构(C语言 第2版)链表采用是有头节点,这两种形式,各有利弊。含头节点链表在学习时,可能会容易些,但是在实践或者在力扣做题时,很少会有带头节点。...链表实现 初始化 在无头单项非循环链表,需要声明一个数据域和指针域,指针域指向是下一个节点地址,数据域是当前节点数据。...空链表不能删,链表只有一个节点链表删除后会变成一个空链表,改变头指针需要存放地址,形参也是一个二级指针。...链表查找实际上就是遍历链表,遍历过程,找到你所需要数值,如果是的,就返回当前节点,不是就继续往下遍历,直到链表为空。

7510

删除链表节点

题目描述 难度级别:简单 请编写一个函数,使其可以删除某个链表给定(非末尾)节点。传入函数唯一参数为 要被删除节点 。...,那么在调用了你函数之后,该链表应变为 4 -> 1 -> 9....提示: 链表至少包含两个节点。 链表中所有节点值都是唯一。 给定节点为非末尾节点并且一定是链表一个有效节点。 不要从你函数返回任何结果。...解题思路 题目中待传递给当前函数实参node,它是链表某一个待删除节点,然后从链表删除这个节点。...这里因为待传入实参没有完整链表,所以无法获取到之前节点,所以无法修改前一个节点next指向。这时需要是将要删除节点值替换为它下一个节点值,之后要删除这个节点next指向为下下一项。

2.4K00

设计在链表删除值相同多余结点算法

这是一个无序链表,我们采用一种最笨办法,先指向首元结点,其元素值为2,再遍历该结点后所有结点,若有结点元素值与其相同,则删除;全部遍历完成后,我们再指向第二个结点,再进行同样操作。...看图解: 这里有两个指针变量p、q,均指向链表首元结点,我们先不移动指针p,而是让指针q去遍历之后所有结点。...这样就成功删除了一个与首元结点重复结点,接下来以同样方式继续比较,直到整个链表都遍历完毕,此时链表已无与首元结点重复结点;然后我们就要修改p指针指向,让其指向首元结点下一个结点,再让q指向其下一个结点...,继续遍历,将链表与第二个结点重复所有结点删除。...以此类推,直至指针p也遍历完了整个链表,则算法结束。

2.1K10

单向循环链表-链表链表基本操作及C语言实现

图3 含有n个结点链表   图 3 ,由于每个结点中只包含一个指针域,生成链表又被称为线性链表链表。   ...图 4 头结点、头指针和首元结点   链表可以没有头结点,但是不能没有头指针!   链表创建和遍历万事开头难,初始化链表首先要做就是创建链表头结点或者首元结点。...->next; temp->next=c; return p; }   注意:首先要保证插入位置可行性,例如图 5 单向循环链表,原本只有 5 个结点,插入位置可选择范围为:1-6,如果超过6,...本身不具备任何意义单向循环链表,程序提示插入位置无效。...从链表删除节点当需要从链表删除某个结点时,需要进行两步操作:   使用malloc函数申请空间,一定要注意手动free掉。

77430

【数据结构】线性表 ⑥ ( 双循环链表 | 双循环链表插入操作 | 双循环链表删除操作 | LinkedList 双循环链表源码分析 )

一、双循环链表插入操作处理 双循环链表 , 需要对 插入 / 删除 / 遍历 操作 进行特殊处理 , 因为需要调节 前驱指针 和 后继指针 两个指针 ; 如 : 双循环链表 , 如果要插入元素...指向 c ③ 将 c 后继指针 指向 b ④ 将 b 前驱指针 指向 c 二、双循环链表删除操作处理 ---- 下面的链表插入成功 , 顺序为 a , c , b , 如果要删除循环链表...LinkedList 双循环链表 , 调用 public E remove(int index) 函数 , 删除指定索引元素 ; 删除核心操作 , 就是 unlink 函数 , 将指定节点从...双循环链表 脱离 ; /** * 移除此列表中指定位置元素。...* 将所有后续元素向左移动(从它们索引减去1)。 * 返回从列表删除元素。

19720

java——删除链表中所有重复结点

思路分析 1.创建一个链表,如图所示: 具体链表实现请参考本博客中文章,下面提供创建链表实现代码 主函数部分: 2.寻找并去除 重复结点 先定义一个引用cur...,当链表不为空、不能发生空指针异常,且cur.next.data 等于cur.data时候,让cur往后走一步,直到不相等时候,将结点连接到新建节点node后,此时删除重复节点之后链表就是所得到值...下面是这一部分代码 3.将最后一个结点置为空 走到链表末尾,需要将tmp引用下一个节点置为空,此时返回链表才不会出错; **注:**最后返回值应为 node.next(因为不确定this.head...是否为重复需要删除结点) 下面是代码: 完整代码

41920
领券