如题
删除倒数第n个元素即将倒数第n+1个元素的next指向倒数第n-1个即可,直观做法先遍历得到node个数,然后找倒数第n+1个元素
public static ListNode removeNthFromEnd(ListNode head, int n){
int index =0;
ListNode node=head;
while(node!=null){//获取元素个数
node=node.next;
index++;
}
if(index ==n){//即删除第一个
return head.next;
}
node =head;
while(index!=n+1){//找到倒数第n+1个元素
node=node.next;
index--;
}
if(node.next.next!=null){//不是删除最后一个元素
node.next=node.next.next;
}else {
node.next=null;
}
return head;
}
结果
进阶要求,一次遍历实现,首先遍历指向的肯定是到最后一个元素,想要在最后同时获得到倒数第n+1个元素,很显然还得加一个指针,有点像游标卡尺了
public static ListNode removeNthFromEnd1(ListNode head, int n) {
ListNode no1 = head;
ListNode no2 =null;//子项倒数第n+1个node
int index =1;
while(no1!=null){
if(no2!=null){//注意需要放在赋值之前
no2=no2.next;
}
if(index==n+1){//遍历到第n+1个元素 初始化no2
no2=head;
}
no1 =no1.next;//向后遍历
index++;//序号加1
}
if(index==n+1){//对应删除第一个元素
return head.next;
}
if(n==1){//删除最后一个
no2.next=null;
}else {
no2.next = no2.next.next;
}
return head;
}
效果倒不是很明显
这篇博客讨论了如何在LeetCode中删除链表的倒数第N个节点,提出了一种直观的方法,即先遍历链表获取节点总数,然后找到倒数第N+1个元素并将其next指向倒数第N-1个。为了解决问题的进阶要求,文章提出了使用双指针一次遍历链表的解决方案,类比于游标卡尺,确保在遍历结束时能准确找到目标节点。
769

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



