首先我们知道在链表删除问题中,首先要想到找到这个要找到这个要删除结点的前驱,这样就能够很好的解决问题
对于这个问题我们可以很好的应用快慢之针这个算法。我们可以设想如果有两个指针p和q,当指针q指向末尾NULL时,指针p和指针q正好相差N个结点
要删除本题中要求的节点,只需要删除指针p的后继结点即可。
1.首先设置一个虚拟结点DummyHead指向头结点head(这里设置虚拟结点的好处就是不需要对头结点做特殊判断)
2.设置两个指针p和q均指向这个虚拟结点
3.移动指针q,使指针p和q相差结点个数为N
4.将指针p和q同步移动,直到指针q指向末尾NULL
5.这是只需要删除指针p的后继结点,即可删除这倒数第N个节点
动画描述:
1 struct ListNode* removeNthFromEnd(struct ListNode* head, int n){ 2 struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode)); 3 dummy->next = head; //设置一个哑结点指向链表的第一个结点(该题不带头结点) 4 struct ListNode *p = dummy,*q = dummy; //进行链表遍历 5 for(int i = 0; i < n; i++){ 6 q = q->next; 7 } 8 while(q->next){ 9 p = p->next; 10 q = q->next; 11 } 12 p->next = p->next->next; 13 return dummy->next; 14 }