c语言手动实现反转链表 Reverse

本题要求实现一个函数,将给定的单链表逆转。
函数接口定义:

List Reverse( List L );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L是给定单链表,函数Reverse要返回被逆转后的链表。
裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

List Reverse( List L );

int main()
{
    List L1, L2;
    L1 = Read();
    L2 = Reverse(L1);
    Print(L1);
    Print(L2);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

5
1 3 4 5 2

输出样例:

1
2 5 4 3 1

思路:
把指针反过来就行,尾指针变头指针。

代码:

List Reverse( List L )
{
    if(L == NULL)return NULL;
    List l1,l2;
    l1 = l2 = NULL;
    while(L!=NULL)
    {
        l1 = L->Next;//记录当前点的下一个结点的地址
        L->Next = l2;//当前点的NEXT指向前一个点
        l2 = L;//l2记录当前点的地址,方便下一个点用。
        L = l1;//L移向下一个要处理的点
    }
    return l2;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是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. 调用反转链表函数,得到反转后的链表头节点指针,并打印反转后的链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值