算法设计题:有一个带头结点的单链表L,设计一个算法将L逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。
时间: 2024-09-27 20:06:02 浏览: 91
要反转一个带头结点的单链表,可以采用迭代或者递归的方式来实现。这里提供一种迭代的方法:
1. 定义三个指针:prev、current 和 next,分别表示前驱、当前和后继节点。初始化时,prev 和 current 都设置为头节点,next 设为 null。
2. 使用一个 while 循环,当 current 不为 null 时执行以下操作:
a. 将当前节点的 next 指向 prev:`current->next = prev;`
b. 更新前驱节点为当前节点:`prev = current;`
c. 移动当前节点到后一个位置:`current = current->next;`
3. 循环结束后,prev 就指向了新的头节点,因为我们在每次迭代中都是把当前节点的 next 指向了前驱。
以下是 Python 的示例代码:
```python
def reverseList(head):
prev = None
current = head
while current is not None:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev
```
相关问题
有一个带头结点的单链表L,设计一个算法将L逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。
要逆置一个带头结点的单链表,可以采用迭代或递归的方法。这里提供一种迭代的方法:
1. 定义三个指针:prev、current和next。初始时,prev指向头结点,current也指向头结点,而next为空。
2. 当current不为null时,执行以下步骤:
a. 将current的下一个节点赋值给next。
b. 将current的next指针更新为prev,完成一次反转操作。
c. 更新prev和current,让它们分别移动到当前节点和next节点的位置。
d. current = next; (继续处理下一个节点)
3. 执行完上述循环后,current会变为null,此时prev就是新的头结点,链表已经被成功逆置。
```python
def reverseList(head):
prev = None
current = head
while current is not None:
next_temp = current.next
current.next = prev
prev = current
current = next_temp
return prev # 返回新的头结点
```
用递归方法逆置一个带头结点的单链表。 提示:设计一个功能算法Reverse( LinkNode *p, LinkNode *&L),即逆置带头结点的单链表。
逆置一个带头结点的单链表通常使用递归的方法可以分为两步:
1. **基本情况**:如果链表为空或只有一个节点,那么它本身就是逆置后的结果,所以直接返回原头结点作为新的头结点。
2. **递归步骤**:对于非空链表,可以将它的剩余部分逆置,然后将当前节点指向下部逆置后的头节点,这样就实现了整体链表的逆置。
以下是递归函数的设计示例(假设`LinkNode`包含`data`字段和`next`指针):
```cpp
LinkNode* Reverse(LinkNode* p) {
// 基本情况:如果链表为空或只有一个节点
if (!p || !p->next)
return p;
// 递归步骤:先处理剩余部分,然后连接到当前节点的反转
LinkNode* newHead = Reverse(p->next); // 递归调用
p->next->next = p; // 将p移动到新头部
p->next = nullptr; // 更新p的next指向null
return newHead;
}
```
这个函数会返回逆置后的新链表的头节点。如果你需要一个带头结点的完整链表,你可以调用`Reverse(head)`并将返回值赋给`head`。
阅读全文
相关推荐














