19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例:输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
提示:
- 链表中结点的数目为 sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
思路:
要想删除某一个结点,首先我们得知道该结点前一个位置,所以我们选择使用快慢指针找到倒数第N个位置并且设置一个前驱指针跟在后面,然后就可以完成删除了`
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* slow = head;
struct ListNode* fast = head;
struct ListNode* prev = head;
//计算节点个数
int count = 0;
while(prev)
{
count++;
prev = prev->next;
}
int ret = count - n + 1;
if(head == NULL)
{
return NULL;
}
//需要删除头节点
if(ret == 1)
{
head = head->next;
return head;
}
//快指针先走n步,慢指针就可以走到倒数第n步
while(n--)
{
fast = fast->next;
}
while(fast)
{
prev = slow;
fast = fast->next;
slow = slow->next;
}
prev->next = slow->next;
free(slow);
slow = NULL;
return head;
}