LeetCode 精选 TOP 面试题(Java 实现)—— 删除链表的倒数第N个节点

一、题目描述

1.1 题目
  • 删除链表的倒数第N个节点

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

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

当删除了倒数第二个节点后,链表变为 1->2->3->5.
  • 说明:
    给定的 n 保证是有效的。

  • 进阶:
    你能尝试使用一趟扫描实现吗?

1.2 知识点
  • 链表
1.3 题目链接

二、解题思路

2.1 自研思路

  这道题的解题思路比较简单,使用快慢双指针即可,具体实现即先让快指针走 n 步,然后让快慢指针同时前进,这样当快指针到达链表末尾时,慢指针刚好指向待删除节点的前置节点。需要注意的是对于当需要删除的链表节点恰好为头结点的处理,为了处理这种情况,应当单独创建一个新的头结点作为原头结点的前置节点。

三、实现代码

3.1 自研实现
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        
        if(head == null) return head;
        
        ListNode newHead = new ListNode(0);
        newHead.next = head;
        ListNode rear = newHead, front = newHead;
        while(n-- > 0 && rear != null)
            rear = rear.next;
            
        // 异常处理
        if(n > 0) return newHead.next; 
        
        while(rear.next != null){
            front = front.next;
            rear = rear.next;
        }
        front.next = front.next.next;
        return newHead.next;
    }
}
发布了244 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40697071/article/details/103921940