题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:给定的 n 保证是有效的。
你能尝试使用一趟扫描实现吗?
解题思路
1.快慢指针一次扫描法
要注意的是可能是要删除第一个节点
java代码如下:
public class Solution {
private class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = new ListNode(Integer.MIN_VALUE);
ListNode later = new ListNode(Integer.MIN_VALUE);
pre.next = head;//引入虚拟头结点
later.next = head;
for (int i = 0; i < n; i++) {
pre = pre.next; //pre先行n步
if(pre == null){ //说明链表节点个数不足n,就不存在倒数第n个节点
return null;
}
}
//pre停在最后一个元素,later停在待删除节点的前一个节点
while (pre.next != null){ //若改为pre==null,则pre停在最后一个元素的空位置,later会停在待删除元素
pre = pre.next;//(这样满足pre先行一步,最后later停在倒数第一个;那么pre先行n步,later将停在倒数第n个)
later = later.next;
}
ListNode relNode = later.next;
if(relNode == head){ //如果需要删除的为头结点
return head.next; //head.next可能为空或者为第二个元素
}
later.next = relNode.next;
relNode.next = null;
return head;
}
}
运行结果如下:
来源:CSDN
作者:执子手 吹散苍茫茫烟波
链接:https://blog.csdn.net/xun_zhao_t521/article/details/104885012