设计一个非递归算法,将一个单链表逆置,比如原链表的各个结点的值为{1,2,3,4,5},逆置之后链表为{5,4,3,2,1}。(15分) 要求:需给出单链表的存储结构定义;
时间: 2024-12-15 12:13:49 浏览: 3
设计一个非递归的单链表逆置算法通常需要借助额外的空间来辅助操作。这里我们可以定义一个辅助节点,用于暂存当前节点的下一个节点,然后将当前节点的next指针指向之前暂存的节点,逐步遍历整个链表。
首先,我们需要定义一个简单的链表节点结构:
```cpp
// 链表节点定义
struct ListNode {
int val; // 节点值
ListNode* next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(nullptr) {} // 构造函数,初始化值和next为nullptr
};
```
接下来,是非递归的逆置链表算法:
```cpp
// 非递归逆置链表函数
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) { // 如果链表为空或只有一个元素,无需逆置,直接返回
return head;
}
// 创建辅助节点
ListNode* prev = nullptr;
ListNode* curr = head;
// 循环遍历链表
while (curr != nullptr) {
// 暂存当前节点的下一个节点
ListNode* nextTemp = curr->next;
// 将当前节点的next指向前一个节点
curr->next = prev;
// 移动prev和curr到下一个节点
prev = curr;
curr = nextTemp;
}
return prev; // 返回新的头节点,即原来的尾节点
}
```
在这个算法中,我们并没有显式地创建新的链表,而是通过改变节点之间的链接实现了链表的逆置。当遍历结束时,`prev`就是新链表的头节点,而原始头节点变成了尾部。
阅读全文