admin 管理员组

文章数量: 1086019


2024年4月21日发(作者:c语言组个最小数)

单链表的逆置c语言算法

单链表的逆置C语言算法

前言:

单链表是一种常用的数据结构,它由一系列节点组成,每个节点包

含数据和指向下一个节点的指针。单链表的逆置是指将链表中的节

点顺序颠倒,即原链表的第一个节点变为新链表的最后一个节点,

原链表的最后一个节点变为新链表的第一个节点。逆置链表在实际

应用中有着重要的作用,例如链表的搜索、排序和删除等操作。

算法思路:

对于单链表的逆置,我们可以利用三个指针来辅助完成。假设原链

表为A->B->C->D->NULL,逆置后的链表为D->C->B->A-

>NULL。初始时,我们定义三个指针:当前指针cur指向当前节点

A,前一个指针prev指向当前节点的前一个节点(初始时为NULL),

下一个指针next指向当前节点的下一个节点(初始时为B)。然后,

我们将当前节点的指针指向前一个节点,即将A->B的指针改为

A<-B。接下来,我们将prev指针指向当前节点,即prev指向A。

最后,我们将cur指针指向next节点,即cur指向B。重复以上操

作,直到cur指针指向NULL,即遍历完整个链表。最后,我们返

回prev指针,即逆置后的链表的头节点。

具体实现:

下面是单链表逆置的C语言代码实现:

```c

#include

#include

// 定义链表节点结构体

typedef struct Node {

int data; // 节点数据

struct Node* next; // 指向下一个节点的指针

} Node;

// 创建链表节点

Node* createNode(int data) {

Node* newNode = (Node*)malloc(sizeof(Node));

newNode->data = data;

newNode->next = NULL;

return newNode;

}

// 逆置链表

Node* reverseList(Node* head) {

Node* prev = NULL;

Node* cur = head;

Node* next = NULL;

while (cur != NULL) {

next = cur->next; // 保存当前节点的下一个节点

cur->next = prev; // 当前节点的指针指向前一个节点

prev = cur; // prev指针指向当前节点

cur = next; // cur指针指向下一个节点

}

return prev; // 返回逆置后的链表头节点

}

// 打印链表

void printList(Node* head) {

Node* cur = head;

while (cur != NULL) {

printf("%d -> ", cur->data);

cur = cur->next;

}

printf("NULLn");

}

int main() {

// 创建链表 A->B->C->D->NULL

Node* head = createNode(1);

head->next = createNode(2);

head->next->next = createNode(3);

head->next->next->next = createNode(4);

printf("原链表:");

printList(head);

// 逆置链表

Node* newHead = reverseList(head);

printf("逆置后的链表:");

printList(newHead);

return 0;

}

```

运行结果:

原链表:1 -> 2 -> 3 -> 4 -> NULL

逆置后的链表:4 -> 3 -> 2 -> 1 -> NULL

总结:

通过三个指针的相互转换,我们可以实现单链表的逆置。这个算法

的时间复杂度为O(n),其中n是链表的长度。逆置链表在实际应用

中有着广泛的用途,例如链表的搜索、排序和删除等操作。因此,

掌握单链表的逆置算法对于程序员来说是非常重要的。希望本文对

您有所帮助!


本文标签: 节点 链表 逆置 指针 指向