以单链表作为存储结构,实现线性表的就地逆置。创建一个非递减序(有重复值)的单链表,实现删除值相同的多余节点
时间: 2024-11-17 13:28:30 浏览: 23
将上题的存储结构改为单链表,同样实现就地逆置。
要实现线性表(单链表)的就地逆置,你需要遍历整个链表,同时用三个指针,两个记录当前节点和它的前驱,另一个作为临时储存。然后依次改变指针的关系,使得链表的节点顺序反转。
以下是C++代码实现:
```cpp
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
void reverseList(ListNode *&head) {
if (!head || !head->next) return; // 如果链表为空或只有一个元素,则无需操作
ListNode *prev = nullptr, *curr = head, *nextTemp = nullptr;
while (curr) {
nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 将当前节点指向其前驱
prev = curr; // 更新前驱为当前节点
curr = nextTemp; // 更新当前节点为原下一个节点
}
head = prev; // 最后更新头节点
}
// 示例:
ListNode* createNonDecreasingList() {
ListNode *head = new ListNode(5);
head->next = new ListNode(4); // 假设有一个重复的值4
head->next->next = new ListNode(4);
head->next->next->next = new ListNode(3);
head->next->next->next->next = new ListNode(2);
head->next->next->next->next->next = new ListNode(1);
// 反转链表
reverseList(head);
return head;
}
int main() {
ListNode *list = createNonDecreasingList();
// 打印链表查看是否已逆置并去除重复值
while (list) {
std::cout << list->val << " ";
list = list->next;
}
return 0;
}
```
在这个例子中,`reverseList` 函数实现了链表的逆置,而 `createNonDecreasingList` 创建了一个包含重复值的非递减序列的链表。运行这个主函数后,你会看到逆置后的链表,重复值已被去除了(因为它们相邻,所以在逆置过程中会被合并到前面)。
阅读全文