链表反转--c语言实现

今天找一个链表问题时,动手用c语言实现了下,不多说直接上代码

/*
 0 2 4 6 8
 8 6 4 2 0
 Press any key to continue
 */

#include <stdio.h>
#include <stdlib.h>
#define ELTYPE int

typedef struct node {
    ELTYPE m;
    struct node *next;
} *NODE;

void InversionNode(NODE head) {
    NODE p,t,q;
    p = NULL;
    t = head->next;
    q = t->next;
    if(t == NULL || q == NULL) return; // 空表和仅有一个结点的链表不用倒置
    while(q) {
        t->next = p; // 倒置结点
        p = t;       // p指向新倒置的结点
        t = q;       // 前进一个结点
        q = q->next;
    }
    t->next = p;     // 处理最后一个结点
    head->next = t;  // head指向倒置后的链表
}
void ShowNode(NODE head) {
    NODE p = head->next;
    for(;p;p = p->next) printf("%d ",p->m);
    printf("\n");
}
NODE CreatNode(int n) { // 创建有头结点的单向链表
    int i;
    NODE head,p,q;
    head = p = (NODE)malloc(sizeof(NODE));
    for(i = 0; i < n; ++i) {
        q = (NODE)malloc(sizeof(NODE));
        q->m = 2 * i;
        p->next = q;
        p = q;
    }
    p->next = NULL;
    return head;
}
int main() {
    NODE head = CreatNode(5);
    ShowNode(head);
    InversionNode(head);
    ShowNode(head);
    return 0;
}
主函数里面,先创建一个链表,实现反转,再打印链表。创建链表、打印部分不难,接下来重点说说 反转算法,上个图各位就明白了:

-----------------------------------------------------------------------------------------------

使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。





    




-----------------------------------------------------------------------------------------------



  • 20
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是C语言实现链表反转的代码: ``` #include <stdio.h> #include <stdlib.h> // 双链表节点结构体 typedef struct ListNode { int val; struct ListNode* next; struct ListNode* prev; } ListNode; // 反转双链表函数 ListNode* reverseList(ListNode* head) { ListNode* prev = NULL; ListNode* curr = head; while (curr != NULL) { ListNode* next = curr->next; curr->next = prev; curr->prev = next; prev = curr; curr = next; } return prev; } // 打印双链表函数 void printList(ListNode* head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } int main() { // 创建双链表 ListNode* node1 = (ListNode*)malloc(sizeof(ListNode)); node1->val = 1; ListNode* node2 = (ListNode*)malloc(sizeof(ListNode)); node2->val = 2; ListNode* node3 = (ListNode*)malloc(sizeof(ListNode)); node3->val = 3; ListNode* node4 = (ListNode*)malloc(sizeof(ListNode)); node4->val = 4; node1->next = node2; node2->prev = node1; node2->next = node3; node3->prev = node2; node3->next = node4; node4->prev = node3; node4->next = NULL; // 打印原始双链表 printf("Original List: "); printList(node1); // 反转双链表 ListNode* newHead = reverseList(node1); // 打印反转后的双链表 printf("Reversed List: "); printList(newHead); return 0; } ``` 代码解析: 1. 定义了一个双链表节点结构体,包括节点值、下一个节点指针和上一个节点指针。 2. 定义了一个反转双链表的函数,参数为头节点指针,返回值为反转后的头节点指针。 3. 在反转双链表函数中,定义了三个指针变量,分别代表前一个节点、当前节点和下一个节点。初始时,前一个节点为NULL,当前节点为头节点。 4. 使用while循环遍历整个双链表,每次迭代时,先将当前节点的下一个节点保存到next指针中,然后将当前节点的next指针指向前一个节点,将prev指针指向next节点,更新前一个节点为当前节点,当前节点为next节点。 5. 最后返回前一个节点,即为反转后的头节点。 6. 定义了一个打印双链表的函数,参数为头节点指针,直接遍历整个链表,打印每个节点的值。 7. 在main函数中,创建了一个包含4个节点的双链表,并打印原始链表。 8. 调用反转双链表函数,得到反转后的链表头节点指针,并打印反转后的链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值