已知单链表L= (a1,a2,a3…an) .用C++语言设计一个算法实现单链表的重新排列,即得到L'=(a1, an, a2, an-1,a3, an-2…)
时间: 2024-10-27 11:10:43 浏览: 12
在C++中,我们可以利用迭代的方式来实现单链表的这种重新排列。以下是简单的步骤:
1. 定义两个指针 `prev` 和 `current`,初始都指向链表头 `head`。
2. 创建一个新的链表 `new_head` 并将其指针设为 `NULL`,用于存储重新排列后的链表。
3. 进行循环操作,直到遍历完整个原始链表:
- 将当前节点 `current` 的值添加到新链表 `new_head` 的末尾(如果 `new_head` 为空则直接添加,否则将当前节点加到 `new_head->next` 后面)。
- 更新指针:`prev` 移动到 `current`,`current` 指向下一个节点 `current->next`。
4. 如果还有剩余节点,需要继续将剩下的节点依次添加到新链表末尾。由于 `prev` 现在位于新链表中间,所以从 `current` 开始,每次都将 `current->next` 添加到 `prev->next` 后,然后移动 `prev` 到 `current`,`current` 到 `current->next`。
5. 最后,将新链表的头节点设置为原链表的头节点 `head`,因为原始链表已经被更新为了新的排列顺序。
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseAndPrint(ListNode* head) {
if (!head || !head->next) return head; // 特殊情况处理,链表只有一个元素或为空
ListNode *prev = nullptr, *current = head, *new_head = nullptr;
while (current) {
ListNode *temp = current->next;
current->next = new_head;
if (new_head) {
new_head->next = temp;
} else {
head = temp;
}
new_head = current;
prev = current;
current = temp;
}
return head;
}
```
阅读全文