题目:
思路:
题目说 one pass
那么,这样,用两个结点(相当于c++的指针)p,q
p先跑n步,然后q和p一起跑,那么p跑到最后,q就正好在倒数第n个上面了。
ps:看了别人的代码,好多都是建立一个不用的头,然后真正的头在next里面,这样代码要少了单独处理头的那部分。
那么,这样,用两个结点(相当于c++的指针)p,q
p先跑n步,然后q和p一起跑,那么p跑到最后,q就正好在倒数第n个上面了。
ps:看了别人的代码,好多都是建立一个不用的头,然后真正的头在next里面,这样代码要少了单独处理头的那部分。
解决方案:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dumy = new ListNode(0);//建立一个不用的头。。。然后真正的头在next里面,减少对头的处理
dumy.next = head;
ListNode p = dumy;
ListNode q = dumy;
for(int i = 0 ; i < n ; i++) p = p.next;
while(p.next != null){
p = p.next;
q = q.next;
}
q.next = q.next.next;
return dumy.next;
}
}