单链表的逆置

来源:互联网 发布:免费简约导航php源码 编辑:程序博客网 时间:2024/05/16 04:53

题目:一个有头结点的单链表,如何将其逆置。

首先定义一个结构体:

typedef int DataType;typedef struct node{DataType data;struct node*next;};

分析:首先考虑一般情况,设置三个指针,分别表示目前,之前,之后位置。pcur,ppre,pnext的节点。逆置时,将pcur的next指针指向ppre,然后将pcur赋值为pnext,接着ppre变为pcur。

接下来考虑,头结点和尾节点的处理。当头结点存储了数据时,设置头结点为pcur,也就是当前结点。ppre,就是之前结点设置为空。按照上面的操作头结点的next指针会指向空。如果头结点为空结点时,将头结点的下一个指针设置为当前结点即可。

pcur指针逐渐后移,直到遇到尾节点,此时pcur指向尾节点,pnext指向空。所以可以用pnext是否为空判断是否到达尾节点。到达尾节点时将pcur赋值给phead.


实现代码如下(假设头结点不为空)

void reverse_list(node *&phead){if (phead==NULL){return;}node*pcur = phead;node*ppre = NULL;node*pnext = NULL;while (ppre){pnext = pcur->next;if (pnext==NULL)//遇到尾节点时将头节点设置为他。{phead = pcur;return;}pcur->next = ppre;ppre = pcur;pcur = pnext;}}

考虑第二种情况,如果头结点不存储数据,那么初始化时将ppcur赋值为phead->next,ppre赋值为NULL,最后在到达尾节点时,将phead指向尾节点。

void reverse_list(node *&phead){if (phead==NULL){return;}node*pcur = phead->next;node*ppre = NULL;node*pnext = NULL;while (ppre){pnext = pcur->next;if (pnext==NULL){phead->next = pcur;//遇到尾节点时让头节点指向他return;}pcur->next = ppre;ppre = pcur;pcur = pnext;}}



原创粉丝点击