力扣连接:删除链表的倒数第 N 个结点
思路:解决链表中倒数第几个节点常用的方法为,双指针法,设置一个low和hight指针,要想删除倒数第几个节点,只需high指针想前先走几步,之后,low和high指针同时移动,直到high==null时,此时low所指的地方,即为要删除的节点。而删除节点,为了使得头结点的删除逻辑与其他节点的逻辑相同,通常会设置一个虚拟头结点来统一操作。且为了能够删除节点,low指针的指向最好为要删除节点的上一个节点,这样能够方便删除。
不使用头节点的代码如下:
/**
* 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.next==null) return null;
ListNode i = head;
ListNode j = head;
ListNode pre =head;
for(int k = 1;k<n;k++){
i = i.next;
}
while(i!=null&&i.next!=null){
if(j==head){
i = i.next;
j = j.next;
}
else{
i = i.next;
j = j.next;
pre = pre.next;
}
}
if(j==pre) return j.next;
pre.next = j.next;
j.next = null;
return head;
}
}
使用头节点的代码如下:
/**
* 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.next==null) return null;
ListNode i = head;
ListNode j = head;
ListNode pre =head;
for(int k = 1;k<n;k++){
i = i.next;
}
while(i!=null&&i.next!=null){
if(j==head){
i = i.next;
j = j.next;
}
else{
i = i.next;
j = j.next;
pre = pre.next;
}
}
if(j==pre) return j.next;
pre.next = j.next;
j.next = null;
return head;
}
}
本文讲解了如何使用双指针技巧解决链表问题,通过设置low和high指针,找到并删除链表倒数第N个节点,同时提供了两种代码实现,包括不使用头节点和常规使用头节点的情况。
2450

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



