LeetCode-19题:删除链表的倒数第 N 个结点【Java实现】
前言:
题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例:
示例1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例2:
输入:head = [1], n = 1
输出:[]
示例3:
输入:head = [1,2], n = 1
输出:[1]
分析
【1】首先我们对特殊情况进行分析:如果当前头结点为空,或者当前链表只有一个元素(删完就为空)
if(head == null || head.next == null){
//当前头结点为空,或者当前链表只有一个元素,删完就为空
return null;
}
【2】接下来,我们创建两个指针left、right,让他们都从head开始
【3】让right向前移动n次=》得到一个【left,right】的范围M
【4】只要当前right的后继结点不为空,就将开始所得到得范围M水平向右移动
【5】当right为链表的尾部时,停止移动,也就是当right.next = null时停止移动
【6】此时left的next所指向的就是我们要删除的结点
全代码:
/**
双指针
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null || head.next == null){
//当前头结点为空,或者当前链表只有一个元素,删完就为空
return null;
}
//两个指针都从头开始
ListNode right = head;
ListNode left = head;
for(int i = 0; i < n; i++){
right = right.next;
}
if(right == null){
return head.next;
}
while(right.next != null){
//只要当前right的next不为空,就表明right当前不为tail(尾)
//就可以继续向前遍历
right = right.next;
left = left.next;
}
ListNode del = left.next;
left.next = del.next;
del.next = null;
return head;
}
}