方法一
思路
1、计算链表总长度len
2、如果需要删除倒数第n个节点,需要寻找第len-n个节点,并将第len-n个节点的next设置为第len-n-2个节点
代码
/**
* 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) {
int len=0;
//前面放一个节点,为了方便统一处理头节点
ListNode temp=new ListNode(0,head);
head=temp;
//计算链表长度
while(temp!=null){
len++;
temp=temp.next;
}
temp=head;
if(len==1 || len==2){
return null;
}
//如果需要删除第n个节点,那我们就需要寻找第len-n个节点
int index=1;
while(index!=len-n){
index++;
temp=temp.next;
}
temp.next=temp.next.next;
return head.next;
}
}
方法二
思路
1、我们在链表第一个数前面添加一个节点,并且默认链表最后一个数的后面是null。
2、需要删除倒数第n个数,需要找到倒数第n+1个数,倒数第n+1个数距离null中间有n个数,利用这个条件我们可以做如下:
·定义p,q节点分别指向链表头节点
·当p-q之间的距离小于n时,q往后移动
·当p-q之间的距离等于n时,p,q均往后移动
直到q=null,则p就是倒数第n+1个数,让其指向后面的后面即可
代码
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p=new ListNode(0,head);
ListNode q=p;
ListNode temp=p;
int inter=-1;
while(inter<=n){
if(q==null){
p.next=p.next.next;
return temp.next;
}
if(inter==n){
p=p.next;
q=q.next;
}else{
inter++;
q=q.next;
}
}
return temp.next;
}
版权声明:本文为weixin_42341543原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。