- 题目描述:
- 题目剖析:
整体思路:
双指针方法,快指针提前走n+1步,之后快慢指针同时移动,直到快指针为空,slow指向的节点便是待删除节点的前一个节点
走n步的细节处理:
尽量不要用先走n步,之后再走一步,因为如果题目中没有规定1 <= n <= size的话,输入的n值大于size,fast为null,再执行fast = fast.next; 会出现空指针异常
注意循环条件:
先移动快指针:n > 0 && fast != null
快慢指针同时移动:fast != null
- Java代码:
public class Solution19 {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode fast = dummyHead;
ListNode slow = dummyHead;
// 这里是fast先走n+1步,为啥选择先让n++,然后fast后移
// 而不是:先走n步,然后fast再后移呢
// 因为如果题目中没有规定1 <= n <= size的话,输入的n值大于size,fast为null,
// 再执行fast = fast.next; 会出现空指针异常
// while (n > 0 && fast != null) {
// fast = fast.next;
// }
// fast = fast.next;
n++;
while (n > 0 && fast != null) {
fast = fast.next;
n--;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummyHead.next;
}
}
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}