单链表操作10-带头结点的单链表逆置(个人学习笔记,仅供参考)

题目要求

设计算法Reverse( ),将带头结点的单链表A逆置,要求利用原有链表的链点,最后输出原单链表和逆置后的单链表。

单链表结点定义

定义如下:

typedef int DataType;
typedef struct Node
{
    DataType data;      // data域用于存储数据元素
    struct Node *next;  // next域用于存放指向其后继的指针
}LNode, *PNode, *LinkList;  // LinkList为头指针

函数接口定义

函数接口如下:

void Reverse( LinkList *a );

*a是原单链表的头指针。

测试程序样例

#include <stdio.h>
int InitLinkList(LinkList *head);       /* 初始化链表, 细节在此不表 */
PNode LinkListInsert(LinkList h, int pos, DataType x)    ;   /* 向链表插入新元素,返回新插入链点的指针,细节在此不表 */
void TraverseLinkList(LinkList h);   /* 遍历单链表,细节在此不表 */
void DestroyLinkList(LinkList h);    /* 销毁单链表,细节在此不表 */

void Reverse( LinkList *a );     /* 本题要求函数 */
int main()
{
    LinkList h;
    DataType x;
    char ch;
    int pos = 1;
    InitLinkList(&h);
    do
    {
        scanf("%d",&x);
        LinkListInsert( h , pos++ , x );
    }while((ch=getchar())!='\n');
    printf("单链表A是\n");
    TraverseLinkList( h );        
    Reverse( &h );
    printf("就地逆置后的单链表为\n");
    TraverseLinkList( h );
    DestroyLinkList( h );
    return 0;
}

/* 请在这里填写答案 */

输入样例

在这里给出一组输入。例如:

11 22 33 44 55 66 77 88 99

输出样例

在这里给出相应的输出。例如:

单链表A是
11 22 33 44 55 66 77 88 99
就地逆置后的单链表为
99 88 77 66 55 44 33 22 11

答案

void Reverse(LinkList *a)
{
    PNode A = *a;			//头结点
    PNode p = A->next;		//p指针初始放在头结点后一位
    PNode r = NULL;			//
    A->next = NULL;			//头结点后继结点置空
    
    while (p != NULL)		//p指针后移的同时,用头插法将该链点挂在头指针后面,达到逆置效果
    {
        r = p->next;        //后继结点
        p->next = A->next;  //p节点继承A的后继
        A->next = p;        //将p结点插入到头结点之后
        p = r;              //p后移
    }
}

数据结构学习中,个人笔记,仅供参考
如有错误,烦请指正
参考视频: 【LinkList10-带头结点的单链表的逆置】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值