记录自已学习之单链表(逆序)

今天就来说一下单链表的最后一个操作了,那就是逆序输出了。其实说到逆序输出,在baidu上也有许多的逆序输出,但在这里我还是想要说一下我看到了方法,我觉得还是挺好用的。

//创建链表的小函数
#include <stdio.h>
#include <stdlib.h>


typedef struct node
{
int num;
struct node *pNext;
}Node;


//创建节点函数的声明
Node *create_node(int cnt);
//遍历链表的函数声明
void traverse_node(Node *pH);
//逆序链表
void reversed_list(Node *pH);
//头插式插入链表
void insert_head(Node *pH, Node *new);


int main(void)
{
//定义一个头指针,指向第一个节点
Node *pHeader = NULL;

pHeader = (Node *)malloc(sizeof(struct node));
if (NULL == pHeader)
{
printf("malloc failure\n");
return 0;
}

//由于头指针一般不存数据,所以赋值为0
pHeader->num = 0;
insert_head(pHeader, create_node(4));
insert_head(pHeader, create_node(3));
insert_head(pHeader, create_node(2));
insert_head(pHeader, create_node(1));

traverse_node(pHeader);
printf("-------------After operation--------------\n");
reversed_list(pHeader);
traverse_node(pHeader);


return 0;
}




//创建节点函数
Node *create_node(int cnt)
{
Node *Tmp = NULL;

Tmp = (Node *)malloc(sizeof(struct node));
if (NULL == Tmp)
{
printf("In create_node, malloc failure\n");
return NULL;
}

//将函数的传参赋值,并将pNext指向NULL
Tmp->num = cnt;
Tmp->pNext = NULL;
return Tmp;
}


//遍历链表的节点
void traverse_node(Node *pH)
{
while ( (pH = pH->pNext) != NULL)
{
printf("num = %d\n", pH->num);
}
}


//头插式插入链表
void insert_head(Node *pH, Node *new)
{
Node *pTmp = NULL;
if (NULL != pH->pNext)
{
pTmp = pH->pNext;
pH->pNext = new;
new->pNext = pTmp;
}
else
{
pH->pNext = new;
}
}


//逆序链表
void reversed_list(Node *pH)
{
//指向当前节点的指针
Node *pCur = pH->pNext;
//指向下一个节点的指针
Node *pnext = NULL;
//判断是否存在节点或是否只有一个节点
if ((NULL == pCur->pNext) || (NULL == pCur))
{
return ;
}
//判断是否已经到达节点尾
while (NULL != pCur->pNext)
{
//这两条语句用于交换两个节点的属性,也就是各自的pNext
pnext = pCur->pNext;
pCur->pNext = pnext->pNext;
//下面两条语句就用于头插式
pnext->pNext = pH->pNext;
pH->pNext = pnext;
}
}

还是像原来的一样,那就是把高潮都放在了最后。Node *pCur = pH->pNext;这条语句就是让头结点后面第一个节点赋值给pCur这个当前节点。到达while的是实际上pCur这个指针一直指向的是头结点pHeader后面的第一个节点,也就是num = 1这个节点。pnext这个节点用于交换节点。pnext = pCur->pNext;首先让它记录pCur的下一个节点位置,pCur->pNext = pnext->pNext;然后让pCur的pNext指向下下个节点的位置,也就是num = 3的这个位置。pnext->pNext = pH->pNext;这条语句让pnxet的pNext指向头节点的下一个节点,刚刚开始还是num = 1的这个节点,但在后面它是不断的变化,因位全靠头插式逆序的。pH->pNext = pnext;这条语句就用于改变头指针下一个节点的位置。我大概说一下整体思路,开始是用一个pCur记住的num = 1的这个节点,它是由始到终没有变过的,但是最后跟它的pNext指向的节点都交换的属性,也就是说把它指向的下一个节点都用头插式提到前面去了。最后它是跟num = 4在这条语句交换属性,让num = 1的这个节点的pNext指向了NULL作为链表结尾。

最后大家可以参照一下这篇博客的图片,跟我说的挺像的:http://blog.csdn.net/duxd1989/article/details/32312655


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值