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

  • 相关阅读:
    codeforces 814B An express train to reveries
    codeforces 814A An abandoned sentiment from past
    codeforces 785D D. Anton and School
    codeforces 785C Anton and Fairy Tale
    codeforces 791C Bear and Different Names
    AOP详解
    Spring集成JUnit测试
    Spring整合web开发
    IOC装配Bean(注解方式)
    IOC装配Bean(XML方式)
  • 原文地址:https://www.cnblogs.com/wangluojisuan/p/3445004.html
Copyright © 2011-2022 走看看