zoukankan      html  css  js  c++  java
  • 单链表逆序、反转

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

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

      1 /******************************************
      2  * 文件名称:reverse.c
      3  * 文件描述:单链表逆序
      4              请注意:没有添加链表释放的函数,
      5              这个文件会造成内存泄露,请自己完善
      6  * 文件作者:by wangluojisuan, in 2013.11.27
      7  * 文件版本:1.2
      8  * 修改记录:
      9 *******************************************/
     10 #include <stdio.h>
     11 #include <stdlib.h>
     12 
     13 //定义链表节点,包含数据域data与指针域next
     14 typedef struct _link_node_ {
     15     int data;                                        //数据域
     16     struct _link_node_ *next;                        //指针域
     17 }linknode_t;
     18 
     19 //定义链表,包含链表头及链表最大长度,当前长度
     20 //链表头head不存储内容,head->next为第一个节点
     21 //建议采用这种链表定义方式,可以包含更多的链表信息
     22 typedef struct _link_list_ {
     23     int m_len;                                        //链表最大长度
     24     int c_len;                                        //链表当前长度
     25     linknode_t *head;                                //链表头
     26 }linklist_t;
     27 
     28 linklist_t * init_linklist(int len);                //初始化链表
     29 linknode_t * _create_linknode(int value);            //创建节点
     30 int insert_linklist(linklist_t *list, int value);    //链表中插入节点
     31 void show_linklist(linklist_t *list);                //显示链表内容
     32 void reverse_linklist(linklist_t *list);            //反转链表顺序
     33 
     34 int main(void)
     35 {
     36     //初始化链表
     37     //输出内容
     38     //反转链表
     39     //输出反转结果
     40     int i = 0;
     41     linklist_t *list = NULL;
     42 
     43     list = init_linklist(10);
     44     if (NULL == list)
     45         exit(-1);
     46 
     47     for (i = 0; i < 10; i++) {
     48         if (0 != insert_linklist(list, i))
     49             printf("error
    ");
     50     }
     51 
     52     show_linklist(list);
     53 
     54     reverse_linklist(list);
     55     show_linklist(list);
     56 
     57     return 0;
     58 }
     59 
     60 /*=====================================================
     61  * 函数名称:_create_linknode
     62  * 函数功能:创建链表节点,节点next指向NULL
     63  * 函数参数:int value    节点数据域的内容
     64  * 返 回 值:linknode *    创建好的链表节点,如果出错返回NULL
     65  * 创 建 人:by wangluojisuan,in 2013.11.27
     66  * 修改记录:
     67 ======================================================*/
     68 linknode_t * _create_linknode(int value)
     69 {
     70     linknode_t *node = NULL;
     71     
     72     node = (linknode_t *)malloc(sizeof(linknode_t));
     73     if (NULL == node)
     74         return NULL;
     75 
     76     node->data = value;
     77     node->next = NULL;
     78 
     79     return node;
     80 }
     81 
     82 /*=======================================================
     83  * 函数名称:init_linklist
     84  * 函数功能:初始化一个链表,并设置最大链表长度
     85  * 函数参数:int len     链表的最大长度
     86  * 返 回 值:linklist *
     87              成功  初始化好的链表
     88              失败  NULL
     89  * 创 建 人:by wangluojisuan,in 2013.11.27
     90  * 修改记录:
     91 ========================================================*/
     92 linklist_t * init_linklist(int len)
     93 {
     94     linklist_t *list = NULL;
     95 
     96     list = (linklist_t *)malloc(sizeof(linklist_t));
     97     if (NULL == list)
     98         return NULL;
     99 
    100     list->m_len = len;    //设置最大长度
    101     list->c_len = 0;    //设置当前长度
    102     list->head = _create_linknode(0);    //头结点赋值
    103 
    104     return list;
    105 }
    106 
    107 /*=======================================================
    108  * 函数名称:insert_linklist
    109  * 函数功能:向链表中插入数据,使用头插法,每次新插入的节点都
    110              放在head的后面
    111  * 函数参数:linklist_t *list     链表
    112              int         value    插入节点数据域值
    113  * 返 回 值:int
    114              成功  0
    115              失败  -1
    116  * 创 建 人:by wangluojisuan,in 2013.11.27
    117  * 修改记录:
    118 ========================================================*/
    119 int insert_linklist(linklist_t *list, int value)
    120 {
    121     linknode_t *node = NULL;
    122 
    123     if (list->c_len >= list->m_len)
    124         return -1;
    125 
    126     node = _create_linknode(value);
    127     node->next = list->head->next;
    128     list->head->next = node;
    129     (list->c_len)++;
    130 
    131     return 0;
    132 }
    133 
    134 /*=======================================================
    135  * 函数名称:show_linklist
    136  * 函数功能:显示链表的内容
    137  * 函数参数:linklist_t *list     链表
    138  * 返 回 值:void
    139  * 创 建 人:by wangluojisuan,in 2013.11.27
    140  * 修改记录:
    141 ========================================================*/
    142 void show_linklist(linklist_t *list)
    143 {
    144     linknode_t *node = NULL;
    145 
    146     node = list->head->next;
    147 
    148     while (NULL != node) {
    149         printf("%d  ", node->data);
    150         node = node->next;
    151     }
    152 
    153     printf("
    ");
    154 }
    155 
    156 /*=======================================================
    157  * 函数名称:reverse_linklist
    158  * 函数功能:反转链表节点
    159  * 函数参数:linklist_t *list     链表
    160  * 返 回 值:void
    161  * 创 建 人:by wangluojisuan,in 2013.11.27
    162  * 修改记录:
    163 ========================================================*/
    164 void reverse_linklist(linklist_t *list)
    165 {
    166     linknode_t *current = NULL,
    167                *pnext = NULL;
    168 
    169     current = list->head->next;
    170     while(NULL != current->next) {
    171         pnext = current->next;
    172         current->next = pnext->next;
    173         pnext->next = list->head->next;
    174         list->head->next = pnext;
    175     }
    176 }

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

  • 相关阅读:
    C++学习之路(四):线程安全的单例模式
    C++学习之路(三):volatile关键字
    C++学习之路(五):复制构造函数与赋值运算符重载
    类对象作为函数参数进行值传递
    System V共享内存介绍
    关于迭代器失效
    C++学习之路(二):引用
    C++学习之路(一):const与define,结构体对齐,new/delete
    epoll内核源码分析
    Redux中间件之redux-thunk使用详解
  • 原文地址:https://www.cnblogs.com/wangluojisuan/p/3445004.html
Copyright © 2011-2022 走看看