题目:
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
本题的解法是基于双指针的,保持两个指针的距离为n,比较快的指针到达末尾了,那么比较慢的指针所指向的就是要删除的点。当然距离最好为n+1,这样比较慢的指针指向的为前趋,比较容易操作删除。代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
if (n <= 0) {
return head;
}
ListNode pre = head;
ListNode cur = head;
int i = 0;
while (i <= n && cur != null) {
cur = cur.next;
i++;
}
if (i <= n) {
return pre.next;
}
while (cur != null) {
pre = pre.next;
cur = cur.next;
}
pre.next = pre.next.next;
return head;
}