题目:
思路:
代码
方法一:l+1-n
求出链表长度
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode(0,head);//取第0个节点
//倒数第n个节点是正数第l-n+1个节点 上一个节点就是l-n
//有一个哑节点+1
ListNode cur=dummy;
for(int i=0;i<getLength(head)-n+1;i++){
cur=cur.next;
}
cur.next=cur.next.next;//删除节点
ListNode ans=dummy.next;
return ans;//返回链表
}
//求出链表的长度
public int getLength(ListNode head){
int length=0;
while(head.next!=null){
length++;
head=head.next;
}
return length;
}
}
方法二:栈方法
```java
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode(0,head);//取第0个节点
//栈方法
Deque<ListNode> stack=new LinkedList<ListNode>();
ListNode cur=dummy;
//全部入栈
while(cur!=null){
stack.push(cur);
cur=cur.next;
}
//栈后进先出 出栈
for(int i=0;i<n;i++){
stack.pop();//删除并返回栈顶元素
}
ListNode pre=stack.peek();//栈顶元素
pre.next=pre.next.next;
ListNode ans=dummy.next;
return ans;
}
}
方法三:双指针
class Solution {
//slow在删除节点的上一个节点
//fast先走 n+1 步
//fast为空 slow停止 slow走了l+1-(n+1)=l-n步
//l-n就是上一个节点(有点绕画个图就明白)
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode(0,head);//取第0个节点
//
ListNode fast=dummy;
ListNode slow=dummy;
for(int i=0;i<n+1;i++){
fast=fast.next;
}
while(fast!=null){
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
ListNode ans=dummy.next;
return ans;
}
}
参考博文官方题解