0019
19. 删除链表的倒数第 N 个结点
题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
方法一:常规想法
思路与代码
先遍历链表长度len,第len-n+1个数据就是我们要删除的。
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = new ListNode(0,head);
int len = getLength(head);
ListNode cur = pre;
for (int i=1; i < len - n + 1; ++i){
//遍历到要删除的数据前一个
cur = cur.next;
}
cur.next = cur.next.next;
ListNode ans = pre.next;
return ans;
}
//获取链表长度
public int getLength(ListNode head) {
int len = 0;
while (head != null){
++len;
head = head.next;
}
return len;
}
方法二:快慢指针(双指针)
思路与代码
第一个指针和第二个指针都先指向头结点,第一个指针先移动n步,随后两个指针同时移动,直到第一个指针为空,这时候第二个指针指向的就是要删除的结点。
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0,head);
ListNode first = head;
ListNode second = dummy;
for(int i = 0; i < n; ++i){
first = first.next;
}
while (first != null){
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}

浙公网安备 33010602011771号