链表中的重用代码

这篇博客深入探讨了链表操作,包括如何反转链表,删除固定节点(考虑头节点情况),判断单链表是否存在环,以及找到链表的中间节点。文中通过伪代码详细解释了每种操作的关键步骤,并提到了在处理链表问题时使用假头节点的技巧,这对于理解链表操作的底层逻辑非常有帮助。
摘要由CSDN通过智能技术生成
  1. 反转链表;固定的while循环
while(head != null){
    next = head.next;  // 记住下一个节点
    head.next = pre; // 改变指向
    pre = head; // 记住前一个节点
    head = next; // head 向下移动
}
  1. 删除某个固定的节点【需要判断是不是删除头节点】;
// 1.可以做一个假的头节点
Node preHead = new Node(-1);
preHead.next = head;

// 2.分条件讨论

// 删除某个节点需要记住要删除的前一个节点
pre = ...;
if (head.vaule == ...){
	pre.next = pre.next.next;
}

public static Node removeValue(Node head, int num){
        while (head != null){
            // 找到一个值不等于num的节点
            if (head.value != num){
                break;
            }
            head = head.next;
        }
        Node pre = head;
        Node cur = head;

        // 这段代码是遍历链表删除某个值的核心代码
        while(cur != null){
            if (cur.value == num){
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
}
  1. 判断单链表是否有环
while (slow != fast) { // 相遇时退出
     if (fast == null || fast.next == null) { // 快指针先到达尾部
         return false;
     }
     slow = slow.next; // 走1步
     fast = fast.next.next; // 走2步
}
  1. 找到中间节点;n1 = n1.next; n2 = n2.next.next;走一步走两步的技巧
while (slow != fast) { // 相遇时退出
     if (fast == null || fast.next == null) { // 快指针先到达尾部
         return false;
     }
     slow = slow.next; // 走1步
     fast = fast.next.next; // 走2步
}
  1. 有时候可以使用一个假的头节点,来解决头节点被删除和改变的可能
Node fakeNode = new Node(-1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值