删除线性链表倒数第n个结点
时间: 2023-05-16 10:05:30 浏览: 183
可以使用双指针法来解决这个问题。首先,让一个指针指向链表的头部,另一个指针指向第n个结点。然后,让两个指针同时向后移动,直到第二个指针到达链表的末尾。此时,第一个指针所指向的结点就是要删除的结点。
具体实现可以参考以下代码:
```
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *p1 = head, *p2 = head;
for (int i = 0; i < n; i++) {
p2 = p2->next;
}
if (!p2) {
return head->next;
}
while (p2->next) {
p1 = p1->next;
p2 = p2->next;
}
p1->next = p1->next->next;
return head;
}
```
这段代码实现了删除链表倒数第n个结点的功能。如果链表长度小于n,则直接返回头结点的下一个结点。否则,使用双指针法找到要删除的结点,并将其从链表中删除。
相关问题
删除线性链表倒数第i个结点
可以使用双指针法来解决这个问题。首先,让一个指针从链表的头部开始移动 i 个位置,然后让另一个指针从链表的头部开始移动,直到第一个指针到达链表的末尾。此时,第二个指针所指向的结点就是倒数第 i 个结点。然后,我们可以将该结点从链表中删除即可。
以下是示例代码:
```
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *p = head, *q = head;
for (int i = 0; i < n; i++) {
p = p->next;
}
if (!p) {
return head->next;
}
while (p->next) {
p = p->next;
q = q->next;
}
q->next = q->next->next;
return head;
}
```
这段代码实现了删除链表倒数第 n 个结点的功能。如果链表长度小于 n,直接返回 head->next 即可。
19. 删除链表的倒数第 n 个结点
删除链表的倒数第 n 个结点可以通过双指针法来实现。首先定义一个虚拟头结点dummy,然后设置两个指针slow和fast,初始时都指向dummy。接着将fast指针向前移动n+1步,然后slow和fast指针一起向前移动,直到fast指针指向空或者到达链表末尾。此时slow指针所指向的结点就是要删除的倒数第n个结点的前一个结点。
然后,我们可以进行删除操作,将slow指针所指结点的next指针指向下下个结点,从而删除倒数第n个结点。最后返回dummy.next即可得到删除倒数第n个结点后的链表。
但是需要注意的是,当要删除的是头结点时,需要单独处理,可以设置一个哨兵结点来避免头结点的特殊情况。
通过双指针法,可以以O(n)的时间复杂度和O(1)的空间复杂度完成删除链表的倒数第n个结点的操作。这种方法的关键在于利用快慢指针的思想,使得在一次遍历中即可完成删除操作,避免了遍历两次链表或使用额外的空间。
阅读全文