【链表】寻找链表中点再深化理解和运用

本文介绍两种链表中点查找及分割方法:一种采用三指针方式,适用于链表分割等操作;另一种采用双指针方式,适用于快速定位链表中点。通过具体实现代码,帮助读者理解算法细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 前言
    在链表相关算法中,经常会遇到寻找链表中点,根据中点分割链表之类的算法;这边记录下寻找链表中点的方法,以及各个指针最终的指向,以便下次再遇到类似的问题时可以直接秒
  • 实现
	// 常规,三指针找到链表中点,pre为中点前一个(常用于分割),slow为中点及其右边
	/*
	注:
	链表长度为奇数的话,slow指向正中间;
	链表长度为偶数的话,slow指向中间两个数的右边;
	*/
        ListNode slow = head, fast = head, prev = null;
        while (fast != null && fast.next != null) {
            prev = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        // 中点右边 slow
        // 中点左边 head
        prev.next = null;

说明:三指针(添加一个指针指向slow的上一个),快速寻找到链表的中点以及进行分割。且之前无需使用if判断

  • 实现二
		// 需要先判空
		if (head == null || head.next == null) {
		   return head;
		}
		// 双指针找到链表中点,slow为中点前一个(常用于分割),slow.next为中点及其右边
        ListNode slow = head, fast = head.next.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        // 中点右边 slow.next;;fast
        fast = slow.next;
        // 中点左边 head
        slow.next = null;

说明:相比上面的三指针,这里让fast先走一步了,然后slow的指向就类似于上面的prev。只不过最开始需要进行判空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值