题目描述
给你一个链表,删除链表的倒数第
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]
做题思路
设置快慢指针,先让快指针走n步,判断删除的是否为第一个结点,如果走完n步后快指针为空直接返回头结点的下一个结点,即待删除结点为第一个结点;否则快指针先走一步,保证待删除结点是slow的下一个结点。
代码
/**
* 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 slow=head;//慢指针
ListNode fast=head;//快指针
//先让快指针走n步
while(n>0){
fast=fast.next;
n--;
}
if(fast==null){//若走完n步发现快指针为空,则删除的为第一个节点
return head.next;
}
//保证slow总是待删除结点的前一个结点,让fast先走一步
fast=fast.next;
while(fast!=null){
slow=slow.next;
fast=fast.next;
}
//因为前面保证了要删除的结点为slow的下一个结点,所以直接删除
slow.next=slow.next.next;
return head;
}
}