单链表的反转 给定一个链表,输出反转后链表的头结点,注意链表的头节点不存放数据。 Input 入参为待反转的链表,例如: 1->2->3->4->NULL Output 输出反转后的链表指针的头指针,例如: 4->3->2->1->NULL
时间: 2024-12-02 20:17:13 浏览: 18
单链表反转是一种常见的链表操作,其目的是改变链表元素的顺序,使得原链表的最后一个节点变成新的头节点,而原来的头节点变成了最后一个节点。这里是一个简单的步骤描述:
1. 定义三个指针,分别称为`prev`, `current` 和 `next`。初始化它们都为`null`,其中`current`指向输入链表的头节点。
2. 当`current`不为`null`时,执行以下操作:
- 将`current`的下一个节点赋值给`next`。
- 将`current`的指针更新为`prev`。
- 如果`next`不是`null`,将`next`的指针更新为`current`,继续遍历。
- 否则,`prev`就是新链表的当前节点,因为已经到达了原始链表的结尾。
3. 遍历结束后,`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
```
相关问题
输入一串数字,构造链表并反转该链表,遍历并输出反转后的链表。本题不使用c++链表不得分。 输入 共1行,依次表示链表存储的整型数字。保证至少有一个数字。 输出 依此反转后的链表每个节点的值。
在编程中,给定一串数字并构造链表并反转它,通常会涉及以下几个步骤:
1. **接收输入**:首先,你需要读取用户输入的一串数字,这通常是通过`sys.stdin.readline()`(Python)或类似方法来完成的。
2. **创建链表结构**:定义一个链表节点类,包含一个数据元素(这里可以假设是整数)和一个指向下一个节点的引用。链表的头节点通常是空的。
3. **构造链表**:遍历输入数字,为每个数字创建一个新的节点,并将其添加到链表中。将新节点的next指向前一个节点,然后将前一个节点设置为新节点,这样就形成了一个链表。
4. **反转链表**:对链表进行反转操作,通常使用迭代或递归的方式。一个常见的技巧是使用三个指针:prev、current和next。初始化prev为None,current为头节点,然后依次移动它们,每次都把current的next指针更新为prev,直到current变为None。
5. **遍历并输出**:最后,从反转后的链表头节点开始,逐个输出节点的值。每次输出current的数据元素,然后将current移动到下一个节点。
6. **代码示例(Python)**:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def build_and_reverse(numbers):
head = None
for num in map(int, numbers.split()):
if not head:
head = ListNode(val=num)
else:
current = head
while current.next:
current = current.next
current.next = ListNode(val=num)
prev = None
current = head
while current:
temp = current.next
current.next = prev
prev = current
current = temp
return prev
def print_linked_list(head):
current = head
while current:
print(current.val, end=' ')
current = current.next
print()
# 假设输入数字是1 2 3 4
numbers = input()
reversed_head = build_and_reverse(numbers)
print_linked_list(reversed_head)
```
用C语言编写一个算法函数,使用链栈或队列,判定给定的字符序列是否为回文,并验证。 提示:回文是指正读和反读均相同的字符序列。要有输入。
在C语言中,我们可以使用链栈(双向链表)或者队列来判断一个字符序列是否为回文。这里我会给出一个简单的链栈实现示例,因为链栈遍历过程更直观,可以轻松地从头开始逐个比较字符直到达到序列尾部。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct Node {
char data;
struct Node* next;
struct Node* prev;
} Node;
// 初始化链栈
Node* initStack() {
return (Node*)malloc(sizeof(Node));
}
// 入栈
void push(Node** top, char c) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = c;
newNode->next = *top;
newNode->prev = NULL;
if (*top != NULL) {
(*top)->prev = newNode;
}
*top = newNode;
}
// 出栈并返回顶部元素
char pop(Node** top) {
if (*top == NULL) {
printf("Error: Stack is empty.\n");
exit(1);
}
char data = (*top)->data;
Node* temp = *top;
*top = (*top)->next;
free(temp);
return data;
}
// 检查回文
int isPalindrome(char str[]) {
Node* stackTop = initStack();
for (int i = 0; str[i] != '\0'; i++) {
push(&stackTop, str[i]);
}
// 反转字符串并与链栈顶元素对比
int j = strlen(str) - 1;
while (j >= 0 && stackTop != NULL) {
if (str[j] != pop(&stackTop)) {
return 0; // 不是回文
}
j--;
}
if (stackTop == NULL) {
return 1; // 是回文
} else {
return 0; // 栈未空,说明不是回文
}
}
int main() {
char input[100];
printf("Enter a string to check if it's a palindrome: ");
fgets(input, sizeof(input), stdin);
// 移除fgets添加的换行符
input[strlen(input) - 1] = '\0';
if (isPalindrome(input)) {
printf("%s is a palindrome.\n", input);
} else {
printf("%s is not a palindrome.\n", input);
}
return 0;
}
```
阅读全文