方法1:
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//1.设置头结点
ListNode dummy=new ListNode(0);
dummy.next=head;
int length=0;
ListNode first=head;
//2.第一次遍历求出链表的长度length
int len=0;
while(first!=null){
first=first.next;
len++;
}
//3.第二次遍历删除元素
len=len-n;
first=dummy;
while(len>0){
first=first.next;
len--;
}
first.next=first.next.next;
return dummy.next;
}
}
方法2:双指针的方法
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode result=new ListNode(0);
result.next=head;
ListNode first=result;//快指针
ListNode second=result;//慢指针
for(int i=1;i<=n+1;i++){//快指针先移动
first=first.next;
}
while(first!=null){//当快指针移动到队尾时,慢指针移动到n-1的节点
first=first.next;
second=second.next;
}
second.next=second.next.next;//慢指针进行删除
return result.next;
}
}