题目

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

19.删除链表的倒数第 N 个结点_数据结构

分析

思路很简单就是两个指针,让一个指针先走,一个指针不动,第一个指针走到n-1步停止,然后一起移动指针,直到第二个指针的next指向空为止,然后删除第一个指针指向的节点,也就是倒数第n个节点,这个题目要注意一个问题,就是边界问题,删除一个节点,需要有一个指针指向它前一个节点才行,因此头节点前面再设置一个哨兵节点,为的是能够删除第一个节点。

代码

/**
* 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 a = head;
ListNode b = head;
ListNode h = new ListNode(0);
h.next = head;
ListNode pre = h;
n--;
while(n!=0){
b = b.next;
n--;
}
while(b.next!=null){
pre = a;
a = a.next;
b = b.next;
}
pre.next = a.next;
return h.next;
}
}

19.删除链表的倒数第 N 个结点_头结点_02