正常想法是先获取到链表长度,再计算出需要删除节点的位置。但是要求扫描一趟,我们可以使用双指针,两个指针的间隔为n,当后面的指针到末尾的时候,利用前面的指针删除节点即可
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode end = dummy;
for(int i=0;i<n+1;i++){
first = first.next;
}
while(first!=null){
first = first.next;
end = end.next;
}
end.next = end.next.next;
return dummy.next;
}
}