python 链表逆序_单链表逆序、反转 - 尤鱼的个人空间 - OSCHINA - 中文开源技术交流社区...

这几天找工作,遇到一个挺好玩的笔试题,做完之后想了一个比较简单的实现方法。

题目是:实现一个单链表的逆序操作,如原来是A->B->C,操作完之后是C->B->A.废话少说,上干货.

cdab19855d02cf564f6ce1a6639374cd.png

/******************************************

* 文件名称:reverse.c

* 文件描述:单链表逆序

请注意:没有添加链表释放的函数,

这个文件会造成内存泄露,请自己完善

* 文件作者:by wangluojisuan, in 2013.11.27

* 文件版本:1.2

* 修改记录:

*******************************************/

#include

#include

//定义链表节点,包含数据域data与指针域next

typedef struct _link_node_ {

int data;//数据域

struct _link_node_ *next;//指针域

}linknode_t;

//定义链表,包含链表头及链表最大长度,当前长度

//链表头head不存储内容,head->next为第一个节点

//建议采用这种链表定义方式,可以包含更多的链表信息

typedef struct _link_list_ {

int m_len;//链表最大长度

int c_len;//链表当前长度

linknode_t *head;//链表头

}linklist_t;

linklist_t * init_linklist(int len);//初始化链表

linknode_t * _create_linknode(int value);//创建节点

int insert_linklist(linklist_t *list, int value);//链表中插入节点

void show_linklist(linklist_t *list);//显示链表内容

void reverse_linklist(linklist_t *list);//反转链表顺序

int main(void)

{

//初始化链表

//输出内容

//反转链表

//输出反转结果

int i = 0;

linklist_t *list = NULL;

list = init_linklist(10);

if (NULL == list)

exit(-1);

for (i = 0; i < 10; i++) {

if (0 != insert_linklist(list, i))

printf("error\n");

}

show_linklist(list);

reverse_linklist(list);

show_linklist(list);

return 0;

}

/*=====================================================

* 函数名称:_create_linknode

* 函数功能:创建链表节点,节点next指向NULL

* 函数参数:int value节点数据域的内容

* 返 回 值:linknode *创建好的链表节点,如果出错返回NULL

* 创 建 人:by wangluojisuan,in 2013.11.27

* 修改记录:

======================================================*/

linknode_t * _create_linknode(int value)

{

linknode_t *node = NULL;

node = (linknode_t *)malloc(sizeof(linknode_t));

if (NULL == node)

return NULL;

node->data = value;

node->next = NULL;

return node;

}

/*=======================================================

* 函数名称:init_linklist

* 函数功能:初始化一个链表,并设置最大链表长度

* 函数参数:int len 链表的最大长度

* 返 回 值:linklist *

成功 初始化好的链表

失败 NULL

* 创 建 人:by wangluojisuan,in 2013.11.27

* 修改记录:

========================================================*/

linklist_t * init_linklist(int len)

{

linklist_t *list = NULL;

list = (linklist_t *)malloc(sizeof(linklist_t));

if (NULL == list)

return NULL;

list->m_len = len;//设置最大长度

list->c_len = 0;//设置当前长度

list->head = _create_linknode(0);//头结点赋值

return list;

}

/*=======================================================

* 函数名称:insert_linklist

* 函数功能:向链表中插入数据,使用头插法,每次新插入的节点都

放在head的后面

* 函数参数:linklist_t *list 链表

int value插入节点数据域值

* 返 回 值:int

成功 0

失败 -1

* 创 建 人:by wangluojisuan,in 2013.11.27

* 修改记录:

========================================================*/

int insert_linklist(linklist_t *list, int value)

{

linknode_t *node = NULL;

if (list->c_len >= list->m_len)

return -1;

node = _create_linknode(value);

node->next = list->head->next;

list->head->next = node;

(list->c_len)++;

return 0;

}

/*=======================================================

* 函数名称:show_linklist

* 函数功能:显示链表的内容

* 函数参数:linklist_t *list 链表

* 返 回 值:void

* 创 建 人:by wangluojisuan,in 2013.11.27

* 修改记录:

========================================================*/

void show_linklist(linklist_t *list)

{

linknode_t *node = NULL;

node = list->head->next;

while (NULL != node) {

printf("%d ", node->data);

node = node->next;

}

printf("\n");

}

/*=======================================================

* 函数名称:reverse_linklist

* 函数功能:反转链表节点

* 函数参数:linklist_t *list 链表

* 返 回 值:void

* 创 建 人:by wangluojisuan,in 2013.11.27

* 修改记录:

========================================================*/

void reverse_linklist(linklist_t *list)

{

linknode_t *current = NULL,

*pnext = NULL;

current = list->head->next;

while(NULL != current->next) {

pnext = current->next;

current->next = pnext->next;

pnext->next = list->head->next;

list->head->next = pnext;

}

}

感觉自己写的比较容易懂了,有问题可以留言,或者QQ1262033368

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值