链表reverse

博客介绍了普通单向链表转置的方法,利用NODE *pCur指向待改变方向的节点,NODE *pRev指向其上一节点,在循环中创建中间变量NODE* pTmp辅助操作,完成节点方向改变,还提及会给出具体代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很普通的单向链表转置,主要方法是利用NODE *pCur指向待改变方向的节点,利用NODE *pRev指向待改变方向节点的上一个节点(如果是第一个节点,即头节点,因为转置后该节点变为尾节点,则此时为NULL),在循环中创建一个中间变量NODE* pTmp,利用中间变量 tmp 存储 cur指针变量存储的节点地址,然后改变cur指向下一个节点,再将tmp指针指向的节点的pNext = pRev,此时pRev已经被指向,完成了它的任务(此时pTmp已经完成转置),则改变它指向的节点的地址为pTmp,使pTmp成为下一个被指向的节点。具体代码如下

void LinkReverse(NODE *pHead)
{
    if( pHead == NULL)
    {
        return;
    }

    NODE *pRev = NULL;
    NODE *pCur = pHead;

    while(pCur != NULL)
    {
        NODE *pTmp = pCur;
        pCur = pCur->pNext;
        pTmp->pNext = pRev;
        pRev = pTmp;
    }
}

 

#include <stdio.h> #include <stdlib.h> // (3) 定义字符型单链表结构体 typedef struct LNode { char data; // 存储字符数据 struct LNode* next; // 后继指针 } LNode, *LinkList; // (4) 尾插法创建链表(带内存分配检查) void CreateList_R(LinkList* L) { *L = (LinkList)malloc(sizeof(LNode)); if (!*L) exit(1); // 内存分配检查 (*L)->next = NULL; LNode* r = *L; // 尾指针 char input; printf("输入字符(空格分隔,#结束):\n"); while (1) { scanf(" %c", &input); // 跳过空白符 if (input == '#') break; LNode* p = (LNode*)malloc(sizeof(LNode)); if (!p) exit(1); // 内存分配检查 p->data = input; p->next = NULL; r->next = p; // 尾插操作 r = p; // 更新尾指针 } } // (4) 打印链表 void PrintLinkList(LinkList L) { LNode* p = L->next; // 跳过头节点 while (p) { printf("%c -> ", p->data); p = p->next; } printf("NULL\n"); } // (5) 转置链表(迭代法) void ReverseList(LinkList* L) { LNode* pre = NULL; LNode* cur = (*L)->next; // 跳过头节点 LNode* next = NULL; while (cur) { next = cur->next; // 保存后继 cur->next = pre; // 反转链接 pre = cur; // 前移指针 cur = next; } (*L)->next = pre; // 头节点指向新首元节点 } // 内存释放 void FreeList(LinkList L) { LNode* p; while (L) { p = L; L = L->next; free(p); } } int main() { LinkList L; // 创建链表 CreateList_R(&L); printf("\n原始链表:"); PrintLinkList(L); // 转置链表 ReverseList(&L); printf("转置链表:"); PrintLinkList(L); // 释放内存 FreeList(L); return 0; }可以再易懂一点吗
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值