单链表头节点的作用及逆置单链表实现
单链表引入头节点的原因
引入头节点主要有以下几个原因:
-
简化链表操作:引入头节点后,原链表中的第一个节点也成为了一个普通节点,与其他节点没有特殊性,这样可以使得链表的插入、删除等操作统一化,不需要对第一个节点进行特殊处理。
-
空链表处理:引入头节点后,即使链表为空,头节点也存在,这样可以方便地判断链表是否为空,而不需要使用额外的变量或标志位来进行判断。
-
方便插入和删除操作:引入头节点后,在链表的头部插入和删除操作时,不需要对头指针进行特殊处理,只需要修改指向头节点的指针即可。
-
统一操作接口:引入头节点后,可以将对链表的操作统一为对普通节点的操作,这样可以减少代码的复杂性。
单链表逆置的编程题目
以下是单链表逆置的源代码实现(C语言):
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建链表
Node* createList(int n) {
Node *head = NULL;
Node *tail = NULL;
for (int i = 0; i < n; i++) {
int data;
printf("请输入第%d个节点的值:", i+1);
scanf("%d", &data);
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 逆置链表
Node* reverseList(Node *head) {
if (head == NULL || head->next == NULL) {
return head;
}
Node *prev = NULL;
Node *current = head;
while (current != NULL) {
Node *next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
// 打印链表
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
int n;
printf("请输入链表的节点个数:");
scanf("%d", &n);
Node *head = createList(n);
printf("原链表:");
printList(head);
Node *newHead = reverseList(head);
printf("逆置后的链表:");
printList(newHead);
return 0;
}
运行示例:
请输入链表的节点个数:5 请输入第1个节点的值:1 请输入第2个节点的值:2 请输入第3个节点的值:3 请输入第4个节点的值:4 请输入第5个节点的值:5 原链表:1 2 3 4 5 逆置后的链表:5 4 3 2 1
注意:以上代码中,逆置链表的函数reverseList返回的是逆置后的头节点,所以需要在主函数中将其赋给一个新的指针变量newHead,然后再打印逆置后的链表。
原文地址: https://www.cveoy.top/t/topic/pbIs 著作权归作者所有。请勿转载和采集!