已知一个单链表如图1所示,编写一个函数将该单链表逆置。
时间: 2024-09-30 21:06:07 浏览: 52
在Python中,可以使用迭代的方式来逆置一个单链表。这里是一个基本的步骤:
首先,我们需要定义链表节点的结构,例如:
```python
# 定义链表节点
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
```
然后,我们可以创建一个函数来逆置链表:
```python
def reverse_list(head):
prev = None # 初始化前驱节点为None
current = head # 初始化当前节点为头节点
while current is not None:
# 保存当前节点的下一个节点
next_temp = current.next
# 将当前节点指向它的前驱节点
current.next = prev
# 移动前驱和当前节点向前
prev = current
current = next_temp
# 返回新链表的头节点,即原链表的尾节点
return prev
```
这个函数通过三个指针prev、current和next_temp,依次完成对每个节点的反转操作,最终prev成为新的头节点。
注意:这个函数假设传入的是非空链表,并且只支持单向链表。
相关问题
已知一个单链表如图1所示,编写一个函数将该单链表逆置。C++
在C++中,可以使用迭代或递归的方式来反转一个单链表。这里提供一个使用迭代方法的示例:
```cpp
#include <iostream>
using namespace std;
// 定义单链表节点结构
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
// 函数来反转单链表
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr; // 初始化前驱指针为空
ListNode* current = head; // 初始化当前指针为头节点
while (current != nullptr) { // 当链表非空时
ListNode* nextTemp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向前驱节点
prev = current; // 更新前驱指针到当前节点
current = nextTemp; // 更新当前指针到下一个节点
}
return prev; // 返回新的头节点,即原链表的尾节点
}
int main() {
// 创建测试链表
ListNode* list = new ListNode(1);
list->next = new ListNode(2);
list->next->next = new ListNode(3);
cout << "Original List: ";
printList(list); // 打印原始链表
ListNode* reversed = reverseList(list);
cout << "Reversed List: ";
printList(reversed); // 打印反转后的链表
delete list;
delete reversed; // 释放内存
return 0;
}
// 辅助函数打印链表
void printList(ListNode* node) {
while (node != nullptr) {
cout << node->val << " -> ";
node = node->next;
}
cout << "nullptr" << endl;
}
```
这个`reverseList`函数会遍历整个链表,并通过改变节点间的引用关系来实现逆置。运行完这个程序,你会看到原来的链表顺序变成了反向。
已知一个单链表如图1所示,编写一个函数将该单链表逆置。C语言
在C语言中,我们可以使用迭代或递归的方式来反转一个单链表。这里我提供一种常见的迭代方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* newNode(int data) {
Node* node = (Node*)malloc(sizeof(Node));
if (node != NULL) {
node->data = data;
node->next = NULL;
}
return node;
}
// 逆置链表的函数
Node* reverseList(Node* head) {
Node* prev = NULL; // 指向当前节点的前一个节点
Node* current = head; // 初始化当前节点
while (current != NULL) { // 当有节点时
Node* temp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向前一个节点
prev = current; // 更新前一个节点为当前节点
current = temp; // 更新当前节点为之前保存的下一个节点
}
return prev; // 返回新的头节点,即原链表的尾部
}
// 打印链表
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 示例链表:1 -> 2 -> 3 -> 4 -> 5
Node* head = newNode(1);
head->next = newNode(2);
head->next->next = newNode(3);
head->next->next->next = newNode(4);
head->next->next->next->next = newNode(5);
printf("Original list:\n");
printList(head);
head = reverseList(head); // 反转链表
printf("\nReversed list:\n");
printList(head);
return 0;
}
```
当你运行这个程序时,它会先打印出原始链表,然后逆置后打印出新的链表。
阅读全文