给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点
时间: 2024-06-22 22:01:12 浏览: 168
当你需要从链表中删除倒数第n个节点时,可以采用迭代或递归的方法。这里我将提供一种迭代的方法:
1. 首先,你需要创建两个指针,一个`current`用于遍历链表,另一个`prev`用于在遍历时记录前一个节点。
2. `current`初始化为头节点,`prev`初始化为`NULL`。
3. 当`current`不为`NULL`且`n-1`大于0时,执行以下步骤:
a. `prev`移动到`current`。
b. `current`移动到`current->next`。
c. `n-1`减1。
4. 当`n-1`变为0时,说明找到了倒数第n个节点(因为`prev`现在指向它),此时`prev`的下一个节点就是我们要删除的节点。
5. 删除节点:如果`prev`不为`NULL`,则将`prev`的`next`设置为`current->next`;否则(即`prev`为`NULL`,意味着头节点就是要删除的节点),链表只有一节,所以直接返回`NULL`。
6. 返回新的头节点:`current`现在就是新链表的头节点。
相关问题
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
题目描述:
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
思路:
使用双指针,先让第一个指针移动 n 个节点,然后同时移动两个指针,直到第一个指针到达链表末尾,此时第二个指针指向的节点就是要删除的节点。
代码实现:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(); // 创建虚拟头节点
dummy->next = head;
ListNode* first = dummy;
ListNode* second = dummy;
for (int i = ; i < n; i++) {
first = first->next;
}
while (first->next != nullptr) {
first = first->next;
second = second->next;
}
ListNode* temp = second->next;
second->next = second->next->next;
delete temp;
return dummy->next;
}
};
给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。
好的,这是一个技术问题,我可以回答。对于Delete Node in a Linked List问题,可以使用双指针算法来解决。首先先让快指针向后移动 n 次,然后将快指针和慢指针都往后移动,直到快指针到达链表尾部。此时慢指针正好指向要删除的节点,让慢指针的 next 指向慢指针的下下个节点即可。最后返回原链表的头节点。
阅读全文