通过只调整链(而不是数据)来交换两个相邻的元素,分别使用a)单 链表;b)双向表链。 用C++实现
时间: 2024-09-20 16:09:15 浏览: 61
在链表结构中,由于链表节点之间没有直接的指针连接,我们无法像数组那样简单地交换两个相邻元素。但是,我们可以使用迭代或者递归的方式来间接交换。这里给出的是使用单链表和双向链表的C++实现:
**a) 单向链表 (Sequential List)**
单向链表中,我们需要先找到要交换的前一个节点(即第一个节点),然后通过临时变量来存储它们的值,再修改节点的next指针。但由于只能单向遍历,所以不能直接访问下一个节点,需要额外一个指针指向下一个待交换位置。
```cpp
// 假设Node是一个有value和next指针的链表节点
void swapAdjacentNodes(ListNode* &head, ListNode* prev) {
if (!prev->next || !prev->next->next) return; // 防止越界
ListNode* temp = prev->next;
prev->next = prev->next->next;
temp->next = prev;
prev->next->next = temp;
}
```
使用时,传入头节点和当前节点作为prev(因为需要知道前一个节点才能操作),例如:
```cpp
ListNode* head = ...; // 初始化好的链表头
ListNode* current = head;
while (current && current->next) {
if (current == head && current->next == head->next) break; // 判断是否是最开始的位置
swapAdjacentNodes(head, current);
current = current->next;
}
```
**b) 双向链表 (Doubly Linked List)**
双向链表则更容易一些,因为我们可以直接访问前后节点。交换同样通过临时变量,只需要改变前后指针即可。
```cpp
struct Node {
int value;
Node *prev, *next;
};
void swapAdjacentNodes(Node **head, Node *prev) {
if (!prev || !prev->next || !prev->next->next) return;
Node *temp = prev->next;
prev->next = temp->next;
temp->next->prev = prev;
temp->prev = prev->prev;
prev->prev->next = temp;
if (temp->next) temp->next->prev = temp;
}
```
使用时只需传入头结点的指针:
```cpp
Node* head = ...; // 初始化好的双向链表头
...
swapAdjacentNodes(&head, head->prev); // 当前节点是第一个节点
```
阅读全文