19.删除链表的倒数第N个节点

一、题目描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

1
2
3
给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

二、题解

1.算法描述

  • 双指针

2.个人分析

  • 先让快指针跑n步;如果快指针为空,则说明删除头节点,然后快慢指针一起跑到末尾;

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/

struct ListNode *removeNthFromEnd(struct ListNode *head, int n)
{
struct ListNode *fast = head, *slow = head, *q;
while (n)
{
fast = fast->next;
n--;
}
if (fast == NULL)
return head->next;
while (fast->next != NULL)
{
fast = fast->next;
slow = slow->next;
}
q = slow->next;
slow->next = slow->next->next;
free(q);
return head;
}