leedcode算法入门:双指针(3)

本文解析了如何通过快慢指针解决链表的中间结点问题,并介绍了删除链表倒数第N个节点的高效算法。通过实例代码演示,适合理解链表操作进阶技巧。

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

目录

876.链表的中间结点

19.删除链表的倒数第N个结点


876.链表的中间结点

题目描述:

 解决思路:

使用快慢指针,快指针走两步,慢指针走一步
当快指针为null的时候,慢指针就走到了中点(奇数)
当快指针为null的时候,慢指针就走到了后一个中点(偶数)

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        //定义快指针
        ListNode fast = head ;
        //定义慢指针
        ListNode slow = head ;
        //循环条件并防止空指针异常
        while(fast != null && fast.next != null){
            //快指针走两步
            fast = fast.next.next ;
            //慢指针走一步
            slow = slow.next ;
        }
        //返回慢指针的指向
        return slow ;
    }
}

19.删除链表的倒数第N个结点

题目描述:

 解题思路:

(1)让前面的指针先移动n步,之后前后指针共同移动直到前面的指针到尾部为止
(2)首先设立预先指针 pre
(3)设预先指针 pre 的下一个节点指向 head,设前指针为 start,后指针为 end,二者都等于 pre
(4)start 先向前移动n步
(5)之后 start 和 end 共同向前移动,此时二者的距离为 n,当 start 到尾部时,end 的位置恰好为倒数第 n 个节点
(6)因为要删除该节点,所以要移动到该节点的前一个才能删除,所以循环结束条件为 start.next != null
(7)删除后返回 pre.next,

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //创建预先指针
        ListNode pre = new ListNode(0) ;
        //预先指针指向头结点
        pre.next = head ;
        //创建后指针
        ListNode low = pre ;
        //创建前指针
        ListNode high = pre ;
        //让前指针先走n步,当n=0时结束循环
        while( n != 0 ){
            //前指针走一步
            high = high.next ;
            //n-1
            n--;
        }
        //当前指针没有走到最后一个结点时,前后指针一起走
        while (high.next != null){
            //前指针走一步
            high = high.next ;
            //后指针走一步
            low = low.next ;
        }
        /*
        当跳出上面第二个while时,low所指向的位置,便是需要删除的位置
        删除的方法就是将low后面第二个数值赋给low下一个指向元素,可以画图更直观
        */
        low.next = low.next.next ;
        //返回pre.next,因为pre没有移动过,它的下一结点就是从头结点开始
        return pre.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java从跨平台到跨行业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值