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

题目是:实现一个单链表的逆序操作,如原来是A->B->C,操作完之后是C->B->A

单链表逆序、反转_反转

/******************************************
 * 文件名称:reverse.c
 * 文件描述:单链表逆序
            请注意:没有添加链表释放的函数,
            这个文件会造成内存泄露,请自己完善
 * 文件作者:by wangluojisuan, in 2013.11.27
 * 文件版本:1.2
 * 修改记录:
*******************************************/
#include <stdio.h>
#include <stdlib.h>
//定义链表节点,包含数据域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