定义链表结构(单项链表)
2025-07-04T06:12:06.png

增加节点

直接向上一个节点的next指向新的节点对象
2025-07-04T06:31:23.png

单项循环链表

2025-07-04T06:20:07.png
head.next.next 与 node2 指向同一节点
2025-07-04T06:23:28.png

删除节点

假如我们要删除2这个中间节点
2025-07-04T06:28:36.png
下面这样做,直接头节点next指向第3个节点
2025-07-04T06:30:23.png

算法题目:判断一个链表是否存在环?

1.使用快慢指针判断

public static  boolean ifhascycyle(ListNode node){
        /*
        作用 1:处理空链表
        场景:当链表为空(node == null)时,无任何节点,必然无环。
        示例:输入null,直接返回false,避免后续指针操作抛出NullPointerException。
        作用 2:处理单节点链表
        场景:当链表只有一个节点(node.next == null)时,无法形成环(环至少需要 2 个节点)。
        示例:链表[1],node.next == null,返回false。若不判断,会进入循环:
        slow = node = 1,fast = node.next = null,后续fast.next.next会报错。
         */
        if(node==null||node.next==null)return false;
        ListNode slow=node;
        ListNode fast=node.next;

        while(slow!=fast){
            /*
        作用 1:防止空指针异常
        当链表无环时,快指针fast会先到达链表尾部:
        若fast == null:说明已到尾节点的下一个位置(null),无法继续移动;
        若fast.next == null:说明fast指向尾节点,其下一个节点为null。
        示例:链表[1→2→3→null],快指针移动过程:
        初始:slow=1, fast=2
        第一次循环:slow=2, fast=3(fast.next=null,触发判断,返回false)
        若不判断,下一步fast.next.next会访问null.next,抛出异常。
        作用 2:判断链表无环
        若链表无环,快指针必然先到达尾部(fast或fast.next为null),此时可确定无环;
        若链表有环,快指针会在环内循环,永远不会到达null,因此不会触发该判断。
             */
            if(fast==null||fast.next==null)return false;
            slow=slow.next;
            fast=fast.next.next;
        }

//存在环那么满足slow==fast
            return true;
    }

2025-07-04T07:07:22.png