此题为力扣中等链表题目
📌 文章目录:
题目:
1️⃣.题目解析
题目要求我们删除链表倒数第N的结点(N为题目给定的数值),题目的大致思路是:先找到题目要求的这个结点位置,记录好这个结点的前驱,再进行删除即可,原理很简单,需要运用到快慢指针的思想,下面进行具体代码实现
2️⃣.代码实现
步骤一、先判断链表为不为空,如果为空无法进行删除操作,返回空对象
if (head == null){
return null;
}
步骤二、定义一个 fast 快指针,slow 慢指针,prev 是删除结点的前驱结点
ListNode fast = head;
ListNode slow = head;
ListNode prev = head;
步骤三、快指针先走 N - 1 步后两个指针再同时走
while(n - 1 != 0){
fast = fast.next;
n--;
}
步骤四、找到倒数的第N个结点,最后得到 slow 是需要删除结点,prev 由于是 slow 的前驱结点所以 prev 少走一步
//找到倒数第 n 个结点
while(fast.next != null){
if (slow != prev){
prev = prev.next;
}
slow = slow.next;
fast = fast.next;
}
步骤五、加一步判断需要删除的是头结点,直接把 head 赋值为下一个结点即可,如果不是头结点,就将前驱的 next 域存储 slow 下一个结点的地址即可完成删除
if (slow == head){
head = head.next;
}
else{
prev.next = slow.next;
}
步骤六、返回新链表的头结点
return head;
图解:
3️⃣.全部代码
/**
* 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) {
if (head == null){
return null;
}
ListNode fast = head;
ListNode slow = head;
ListNode prev = head;
while(n - 1 != 0){
fast = fast.next;
n--;
}
//找到倒数第 n 个结点
while(fast.next != null){
if (slow != prev){
prev = prev.next;
}
slow = slow.next;
fast = fast.next;
}
if (slow == head){
head = head.next;
}
else{
prev.next = slow.next;
}
return head;
}
}