以单链表作为存储结构,实现线性表的就地逆置。 2. 创建一个非递减序(有重复值)的单链表,实现删除值相同的多余结点。用cpp写
时间: 2024-11-17 18:30:22 浏览: 31
1. 要以单链表作为存储结构,实现线性表的就地逆置(也称为原地反转),可以采用迭代法或递归法。这里提供一个简单的迭代方法:
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* prev = nullptr;
ListNode* curr = head;
ListNode* nextTemp = nullptr;
while (curr != nullptr) {
nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 将当前节点指向前一个节点
prev = curr; // 移动prev到curr
curr = nextTemp; // 移动curr到下一个未处理的节点
}
return prev; // 返回新的头节点
}
```
2. 要创建一个非递减序(允许有重复值)的单链表,并实现删除值相同的多余结点,可以遍历链表,比较相邻节点的值。以下是cpp实现:
```cpp
void deleteDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return;
}
head->next->prev = nullptr; // 设置新头节点的前驱为NULL,便于后续操作
ListNode* curr = head;
while (curr->next != nullptr && curr->val == curr->next->val) {
ListNode* temp = curr->next;
curr->next = temp->next;
delete temp; // 删除重复节点
}
curr = head->next; // 继续处理剩余部分
while (curr != nullptr) {
ListNode* next = curr->next;
while (next != nullptr && next->val == curr->val) {
ListNode* dup = next;
next = dup->next;
delete dup;
}
curr = next;
}
}
```
阅读全文