给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn2925/
这个算法主要考察以下几个知识点,可惜我还没有学透,只能参考别人代码。
重点考察的知识点为:双指针或者快慢指针方法,先把参考代码放上面,后续会做补充。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
//如果链表节点的个数为0 直接返回
if(n==0)
{
return head;
}
struct ListNode *fastp = NULL;//fastp为快指针
struct ListNode *slowp = NULL;//slowp为慢指针(用于指向待删除的结点)
struct ListNode *slowq = NULL;//指向待删除结点的前驱结点
//(1)先让快指针后跑n个结点
for(fastp = head;n>0;fastp = fastp->next,n--);
// (2)fastp找到自己的位置后就停止了,fastp现在在n的位置
slowp = head;
// (3)然后让快指针和慢指针一起向后跑,slowp为slowq的联动指针
// 当快指针跑到NULL时停止,这时候快指针一定指向待删除结点
while(fastp){
slowq = slowp;
slowp = slowp->next;
fastp = fastp->next;
}
// (4)如果要删除的结点为头结点,需要单独处理。否则,利用slowq->next=slowp->next即可删除结点
if(slowp==head)
head = head->next;
else
{
slowq->next = slowp->next;
free(slowp);
}
return head;
}