这题用到一个链表常用的找倒数第n个node的方法,就是用两个node先后出发,runner先走,走到n的时候walker出发,runner走到头的时候walker就在n的位置。
要注意处理边界。。蛮头痛的,比如长度只有1的情况和删除首位的情况。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (0 == n) return null;
ListNode runner = head;
ListNode walker = head;
int i = 0;
//这里的条件不能写成runner.next!=null因为有可能node长度就是1
while (runner!= null) {
if (i < n) {
runner = runner.next;
i++;
} else {
break;
}
}
//这时候runner有可能是null的,注意null pointer。这种情况对应删除首位的情况比如[1,2] 2
if(runner==null) return head.next;
while (runner.next!= null) {
walker = walker.next;
runner = runner.next;
}
walker.next = walker.next.next;
return head;
}
}