题目:给定一个链表,移除从尾节点开始往前数的第N个节点
思路:题目要求一次遍历解决问题,所以需要一些特殊的解法。我们可以使用快慢指针,定义两个指针a,b,a先从链表头开始走N步,然后a,b开始同时走,直到a走到末尾,因为b比a晚走N步,所以此时b指向倒数第N个节点。因为我们要删除该节点,所以需要定义一个头节点指向链表头,这样我们找到的就是倒数第N+1个节点。
/**
* 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) {
ListNode *a,*b;
ListNode *before=(ListNode *)malloc(sizeof(ListNode));
before->next=head;
a=before;b=before;
while(n-->0)a=a->next;
while(a->next!=NULL){
a=a->next;
b=b->next;
}
b->next=b->next->next;
return before->next;
}
};