LeetCode.19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例: 给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后
链表变为 1->2->3->5.
说明:给定的 n 保证是有效的。
进阶:你能尝试使用一趟扫描实现吗?
Tips: 链表 快慢指针
具体思路:
题目既然说了n为有效的,那我们就不用考虑n为负或者n大于list.size()
。
以前做过找倒数第k个节点,用的快慢指针,那这个题不妨也试试。 生成新的节点tem
,tem.next = head
,此处的tem
防止删的是head
。
再生成两个节点pre
(慢指针)和cur
(快指针),都指向tem
。要删掉倒数第n个数,那我们就要找到他的前驱节点,让前驱节点的next
指向他的next.next
。
具体操作: cur
单独前进n个位置,此时cur
和pre
距离为n。然后while语句,当cur.next
不为空,也就是它指向最后一个节点时候。此时pre
位置为指定节点的前一位。
再进行操作pre.next =pre.next.next
,即完成删除指定节点的操作,返回tem.next
具体代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode tem = new ListNode(0);
tem.next = head;
ListNode pre = tem,cur = tem;
while(n != 0){
cur = cur.next;
n --;
}
while (cur.next != null){
cur = cur.next;
pre = pre.next;
}
pre.next = pre.next.next;
return tem.next;
}
}