给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路很简单,采用双指针pre 和index,开始时两个都指向头部。删除倒数第几个就让index指针先走几步。
然后两个指针同步下移,index的next为空时结束遍历,pre指向的节点就是需要删除的。
因为pre指向尾节点的情况下不会删除pre指向的节点,所以又加了第三个指针,pre的前指针。
总的来说这个题目还是偏简单,就是具体实现的时候删除指定节点遇到了点问题,做个记录。
public ListNode removeNthFromEnd(ListNode head, int n) {
if (null == head) {
return null;
}
if (n <= 0) {
return head;
}
ListNode exPre = head;
ListNode pre = head;
ListNode index = head;
for (int i = 1; i < n; i++) {
index = index.next;
if (null == index) {
return head;
}
}
while (index.next != null) {
exPre = pre;
pre = pre.next;
index = index.next;
}
//pre指向的节点为要删除的节点
//删除的时候分了两种情况,一种是要删除的节点有后继节点
if(null != pre.next){
pre.val = pre.next.val;
pre.next = pre.next.next;
}else {
//要删除的节点没有后继节点。这里又有一个特殊情况就是链表只有一个节点
if(exPre.next == null){
return null;
}
exPre.next = null;
}
return head;
}
本文介绍了一种仅需一次遍历的高效算法,用于删除链表中倒数第N个节点。通过双指针技巧,预指针和索引指针的巧妙配合,实现了简洁而优雅的解决方案。
419

被折叠的 条评论
为什么被折叠?



