單鏈表逆序、反轉

這幾天找工做,遇到一個挺好玩的筆試題,作完以後想了一個比較簡單的實現方法。node

題目是:實現一個單鏈表的逆序操做,如原來是A->B->C,操做完以後是C->B->Aide

101129693.png

/******************************************
 * 文件名稱: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函數