2. 算法设计题,以下每道题请给出C++代码,并给出必要的注释。 给定一个单向列表,请编写一个函数,删除列表的倒数第个节点。要求:空间复杂度为O(1),时间复杂度为O(n),且只能遍历一次列表。
时间: 2024-10-12 11:14:03 浏览: 28
为了实现这个功能,我们可以创建一个指向当前节点的指针 `prev` 和一个指向最后一个访问过的节点的指针 `last`。在遍历过程中,当找到最后一个节点时,将其前一个节点设为 `null` 即可删除倒数第1个节点。
以下是对应的 C++ 代码实现:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {
int val; // 节点值
ListNode *next; // 指向下个节点
ListNode(int x) : val(x), next(NULL) {} // 构造函数
};
// 删除链表的倒数第一个节点
ListNode* deleteLast(ListNode* head) {
if (head == nullptr || head->next == nullptr) { // 如果链表为空或只有一个元素
return nullptr;
}
ListNode *prev = head, *current = head->next; // 初始化 prev 和 current
while (current->next != nullptr) { // 遍历链表,直到找到最后一个节点
prev = current;
current = current->next;
}
// 当找到最后一个节点时,将它的前一个节点设置为 null
prev->next = NULL;
return head; // 返回头节点,现在链表已更新
}
int main() {
// 创建示例链表
ListNode *list = new ListNode(1);
list->next = new ListNode(2);
list->next->next = new ListNode(3);
// 打印原链表
ListNode *temp = list;
while (temp != nullptr) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
// 删除倒数第一个节点后打印链表
list = deleteLast(list);
temp = list;
while (temp != nullptr) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
return 0;
}
```
阅读全文