LeetCode No.19 删除链表的倒数第N个节点

LeetCode No.19 删除链表的倒数第N个节点

题目:

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
Related Topics 链表 双指针

Related Topics

链表 双指针

分析

  • 新建两个指针变量fast, slow初始化指向头节点
  • 快指针fast向后移动n个节点,使得快慢指针相差为n,即慢指针指向待删除节点的前一位
    • 如果fast移动到了最后,说明链表的长度等于n,也就是要删除的是第一个节点,直接返回head.next
  • 快指针移动到和慢指针相差n个节点后,同时移动两个指针,直到快指针移动到最后
  • 此时,快指针指向最后,慢指针指向倒数第(n + 1)个节点,也就是待删除的前一个
  • slow.next = slow.next.next;``slow指向下下个节点(跳过下一个)

图示:

在这里插入图片描述

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //快慢双指针,快指针指向最后,慢指针指向要删除节点的前一位
        ListNode fast, slow;
        fast = slow = head;
		// 快指针移动n步
        //如果移动到了最后说明链表长度和n相等,返回head.next
        for (int i = 0; i < n  ; i++) {
            fast = fast.next;
            if (fast == null){
                return head.next;
            }
        }
        
		//同步移动两个指针
        while (fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;

        return head;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值