寻找链表入环的第一个节点

采用快慢指针的方法:
快指针fast走两步,慢指针slow走一步,如果相遇就是带环链表;
然后让cur1从链表头开始走,cur2从相遇点开始走,再次相遇的位置就是入环的第一点

public class DateCycle {
    static class ListNode {
        int val;
       ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
        //使用快慢指针
        public ListNode dateCtCycle(ListNode head){
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&slow!=null){
            fast=fast.next.next;//快指针一次走两步,慢指针一次走一步,如果带环,则会相遇
            slow=slow.next;
            if(fast==slow){
                //相遇就跳出循环
                break;
            }
        }
            if (fast == null||slow==null){
                //说明不带换
                return null;
            }
            //创建两个节点,一个从链表头部出发,一个从相遇位置出发,再次相遇的位置就是入环第一节点
            ListNode cur1=head;
            ListNode cur2=fast;
            cur1=cur1.next;
            cur2=cur2.next;
            while(cur1!=cur2){
                cur1=cur1.next;
                cur2=cur2.next;
            }
            return cur1;
        }
    }
}

### 如何找到链表倒数第二个节点 为了找到链表中的倒数第 `n` 个节点,可以采用双指针方法。这种方法通过两个指针之间的距离来定位目标节点。 具体来说,定义两个指针 `slowNode` 和 `fastNode` 都指向链表头部。首先使 `fastNode` 向前移动 `n-1` 步,这样两者的间距即为 `n-1`。如果在此期间 `fastNode` 到达了链表末端,则表示链表长度不足 `n`,应返回 `null` 表明操作失败[^3]。 当 `fastNode` 成功前进到适当位置后,继续同步向前推进这两个指针直到 `fastNode` 达到了最后一个有效结点处停下。这时 `slowNode` 所指向的位置正好是要找的那个倒数第 `n` 的元素之前的一个元素。对于特定情况下的倒数第二节点而言,只需设置参数 `n=2` 即可完成查询任务。 下面是基于上述逻辑的具体 Java 方法实现: ```java private static ListNode findSecondLastNode(ListNode linkedListNode, int i){ if (linkedListNode == null || linkedListNode.next == null) { return null; } ListNode slowNode = linkedListNode; ListNode fastNode = linkedListNode; // Move the fast pointer ahead by 'i' nodes. for (int j = 0; j < i - 1 && fastNode != null; ++j) { fastNode = fastNode.next; // If list is shorter than expected length before reaching end of loop, // then there aren't enough elements to reach back from tail with given index. if (fastNode == null) { break; } } // Check again after exiting early due to short circuit condition above. if (fastNode == null) { return null; } // Advance both pointers until we hit last element in original list. while (fastNode.next != null) { fastNode = fastNode.next; slowNode = slowNode.next; } // Now slow points at desired node's predecessor or itself when looking for second-to-last item specifically here. return slowNode; } ``` 此函数接收一个单向链接列表作为输并尝试获取其倒数指定序号的节点。特别地,要获得倒数第二个节点时传数值 `2` 给形参 `i` 就能解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值