链表逆置数据结构pta
时间: 2024-11-19 16:13:43 浏览: 26
链表逆置是一种常见的数据结构操作,它的目的是将一个已排序的单向链表的所有元素顺序翻转。在链表中,每个节点包含一个指向下一个节点的指针,而逆置意味着最后一个节点会变成第一个,倒数第二个节点成为倒数第一个,以此类推。
在Python中,可以使用迭代或者递归的方式实现链表逆置。下面是迭代的一种常见方法:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseList(head):
prev = None
curr = head
while curr is not None:
next_temp = curr.next
curr.next = prev
prev = curr
curr = next_temp
return prev
```
在这个例子中,`prev` 指针开始为空,然后每次循环都将当前节点 `curr` 的 `next` 指向前一个节点 `prev`,直到遍历完整个链表。最后返回新的头节点 `prev`,它就是原链表的反向。
相关问题
c++实现链表逆置(数据结构)
链表逆置是将链表中的节点顺序颠倒。以下是C语言中链表逆置的实现方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 链表逆置函数
Node* reverseList(Node* head) {
Node* prev = NULL;
Node* current = head;
Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
// 创建链表
Node* head = malloc(sizeof(Node));
Node* second = malloc(sizeof(Node));
Node* third = malloc(sizeof(Node));
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
printf("原链表: ");
printList(head);
// 链表逆置
Node* newHead = reverseList(head);
printf("逆置后的链表: ");
printList(newHead);
// 释放内存
free(head);
free(second);
free(third);
return 0;
}
```
输出结果:
```
原链表: 1 2 3
逆置后的链表: 3 2 1
```
pta题库c语言链表逆置
PTA(Problem Translation Access,题目翻译平台)上的C语言链表逆置通常是指将一个单向链表从头到尾反转的过程。链表是一种动态数据结构,在C语言中,你可以通过遍历链表,并在每个节点上修改指针来实现逆置。
下面是一个简单的步骤描述:
1. 定义两个指针,一个指向当前节点(current),另一个指向前一个节点(prev)并初始化为NULL。
2. 使用循环开始遍历原链表,直到current变为NULL:
a. 将当前节点的下一个节点赋值给temp,保存当前节点的下一个节点。
b. 更新当前节点的next指针,使其指向前一个节点prev。
c. 移动prev和current,prev前进一位,current设置为temp。
3. 遍历结束后,prev会指向新的头节点,原来的头节点就是新的尾节点。
以下是伪代码示例:
```c
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* prev = NULL;
struct ListNode* current = head;
while (current != NULL) {
struct ListNode* temp = current->next; // 保存下一个节点
current->next = prev; // 反转当前节点的next指针
prev = current; // 更新前一个节点
current = temp; // 移动current到下一个节点
}
return prev; // 返回新链表的头节点
}
```
阅读全文