定义链表结构(单项链表)
增加节点
直接向上一个节点的next指向新的节点对象
单项循环链表

head.next.next 与 node2 指向同一节点
删除节点
假如我们要删除2这个中间节点
下面这样做,直接头节点next指向第3个节点
算法题目:判断一个链表是否存在环?
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;
}
评论已关闭