Chinaunix首页 | 论坛 | 博客
  • 博客访问: 247785
  • 博文数量: 49
  • 博客积分: 110
  • 博客等级: 民兵
  • 技术积分: 510
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-13 00:59
个人简介

make it run,make it better,make it fast. https://github.com/liulanghaitun

文章分类

全部博文(49)

文章存档

2023年(1)

2022年(2)

2020年(4)

2019年(4)

2017年(15)

2016年(3)

2014年(3)

2013年(14)

分类: Windows平台

2013-04-07 23:45:11

递归单链表反转:

#include
#include
#define EXIT_SUCCESS 0
#define EXIT_FAILED 1

/**
 * 定义节点
 */
typedef struct Node
{
         int data;
         struct Node* next;
}pNode;

/**
 * 创建节点
 */
pNode* createNode(const int value)
{
     pNode* node = (pNode*)(malloc(sizeof(pNode)));
     if(NULL == node)
     {
      printf("%s\n","malloc failed!");
      exit(EXIT_FAILED);
     }
     node->next = NULL;
     node->data = value;
     return node;
}

/**
 * 创建链表
 */
pNode* createLinkList(const int* input,int length)
{
     if((NULL == input) || (0 == length))
     {
      printf("%s\n","input value error!");
      return NULL;
     }
     if(1 == length)
     {    
      return createNode(*input);
     }        
     pNode* currentNode = createNode(*input);
     pNode* nextNode = createLinkList(++input,--length);
     currentNode->next = nextNode;
     return currentNode;
}

/**
 * 反转链表
 */
pNode* reverseLinkList(pNode* currentNode,pNode* preNode)
{
     pNode* tmpNode = currentNode;
     if(NULL != (currentNode->next))
     {        
      tmpNode = reverseLinkList(currentNode->next,currentNode);
     }    
     currentNode->next = preNode;
     return tmpNode;
}

/**
 * 打印链表
 */
void printLinkList(const pNode* head)
{
      if(NULL == head)
     {    
      printf("%s\n","the LinkList is Null!");
      return ;
     }        
     printf("%d\t",head->data);
     if(NULL != (head->next))
     {
      printLinkList(head->next);
     }
}

/**
 * 主函数
 */
int main(void)
{
     const int input[5]={2,4,6,7,9};
     const int length = sizeof(input)/sizeof(input[0]);
     pNode* linkList = createLinkList(input,length);
     printLinkList(linkList);
     printf("%s\n","\n-------reverse linklist------");
     pNode* result = reverseLinkList(linkList,NULL);
     printLinkList(result);
     return EXIT_SUCCESS;
}

运算结果:
2       4       6       7       9
-------reverse linklist------
9       7       6       4       2

阅读(2606) | 评论(6) | 转发(1) |
0

上一篇:Y组合子

下一篇:快速排序

给主人留下些什么吧!~~

流浪的海豚2013-04-08 22:21:23

流浪的海豚:代码有点问题,当你把第一个节点的下一个节点置空的时候,你用新节点保存节点已经不再是原来的第一个节点,导致的结果就是tmp=tmp->next的时候,tmp为空了,循环只执行了一次就中断了。
我测试了一下,结果是:
2       4       6       7       9
-------reverse linklist------
2

卡住了,回复了两次

回复 | 举报

流浪的海豚2013-04-08 22:20:35

moon_rock:没测过。

代码有点问题,当你把第一个节点的下一个节点置空的时候,你用新节点保存节点已经不再是原来的第一个节点,导致的结果就是tmp=tmp->next的时候,tmp为空了,循环只执行了一次就中断了。
我测试了一下,结果是:
2       4       6       7       9
-------reverse linklist------
2

回复 | 举报

流浪的海豚2013-04-08 22:20:32

moon_rock:没测过。

代码有点问题,当你把第一个节点的下一个节点置空的时候,你用新节点保存节点已经不再是原来的第一个节点,导致的结果就是tmp=tmp->next的时候,tmp为空了,循环只执行了一次就中断了。
我测试了一下,结果是:
2       4       6       7       9
-------reverse linklist------
2

回复 | 举报

moon_rock2013-04-08 20:39:10

没测过。

moon_rock2013-04-08 20:37:11

reverse_slist(node* h)
{
    node* tmp = h;
    node* new = NULL;
    while(tmp)
    {
        tmp->next = new;
        new = tmp;
        tmp = tmp->next;
    }