题目:
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-1,当后一个指针指向链表末尾结点的时候,前一个指针指向的结点就是要删除的结点。

C++参考代码:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
ListNode *removeNthFromEnd(ListNode *head, int n)
{
if (!head) return nullptr;
int count = 1;
ListNode *previous = nullptr;//指向front元素前面的结点
ListNode *front = head;//前面的指针,指向要删除的结点
ListNode *back = head;//与front指针保持n-1的距离
//将back指针从第1个位置移动到第n个位置
while (count < n)
{
back = back->next;
count++;
}
//将back指针一直移动到;链表最末尾
while (back->next)
{
previous = front;
front = front->next;
back = back->next;
}
//如果previous不为空,则将previous指针的next指向front的next,即将front删除
if (previous)
{
previous->next = front->next;
}
//如果previous为空,说明删除的是第一个位置的结点即头结点
else
{
head = head->next;
}
front = nullptr;
return

C#参考代码:

/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
public ListNode RemoveNthFromEnd(ListNode head, int n)
{
if (head == null) return null;
ListNode previous = null;
ListNode front = head;
ListNode back = head;
for (int i = 0; i < n - 1; i++)
{
back = back.next;
}
while (back.next != null)
{
previous = front;
front = front.next;
back = back.next;
}
if (previous != null)
{
previous.next = front.next;
}
else
{
head = head.next;
}
front = null;
return

Python参考代码:

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
# @return a ListNode
def removeNthFromEnd(self, head, n):
if not head:
return None
previous = None
front = head
back = head
count = 1
while count < n:
back = back.next
count += 1
while back.next:
previous = front
front = front.next
back = back.next
if previous:
previous.next = front.next
else:
head = head.next
del front
return