现在的位置: 首页 > 综合 > 正文

单链表逆置

2013年08月28日 ⁄ 综合 ⁄ 共 1664字 ⁄ 字号 评论关闭
 

单链表逆置
 
单链表逆置在面试中经常见到,于是自己随变写了一个与大家一起学习交流,有什么意见或建议欢迎提出,大家共同进步啊:-)
 
#include <stdio.h>
#include <stdlib.h>
#define ITEM_NUM 10
typedef struct tagNode {
    int e;
    struct tagNode *next;
}Node;
 
Node* LinkList_create();
void LinkList_destroy(Node* head);
void LinkList_print(Node* head);
Node* LinkList_reverse(Node* head);
 
int main(int argc,char* agrv[])
{
    Node* head = LinkList_create();
    Node* head_reversed;
 
    printf("The link list data is:/n");
 
    LinkList_print(head);
 
    head_reversed = LinkList_reverse(head);
 
    printf("After reversed,the link list data is:/n");
 
    LinkList_print(head_reversed);
 
    system("Pause");
 
}
 
Node* LinkList_create()
{
    Node* nodes = (Node*)calloc(ITEM_NUM,sizeof(Node));
 
    int i;
 
    printf("Create link list.../n");
    for(i=0;i<ITEM_NUM;i++)
    {
        nodes[i].e = (i+1)*3;
 
        if(i< ITEM_NUM-1)
            nodes[i].next = &nodes[i+1];
        else
            nodes[i].next = NULL;
    }
 
    return nodes;  
}
 
void LinkList_destroy(Node* head)
{
    printf("Destroy the link list.../n");
    if(head) free(head);
}
 
void LinkList_print(Node* head)
{
    if(head==NULL) return;
 
    while(head)
    {
        printf("%d/n",head->e);
        head = head->next;
    }
}
 
Node* LinkList_reverse(Node* head)
{
    Node *preNode,*curNode,*nextNode;
 
    if(head==NULL) return NULL;//空链表
 
    if(head->next == NULL) return head;//仅一个元素
 
    curNode = head;preNode=NULL;//初始化
 
    while(curNode)
    {
        nextNode = curNode->next;//先记录下一个结点
        curNode->next = preNode;//改变链表方向(逆置)
        preNode = curNode;//将当前结点作为下一次循环的前一个结点
        curNode = nextNode;//向后推移一个结点
    }
 
    return preNode;//当遍历完链表后curNode应该为空,此时preNode就是逆置后链表头(head)
 
}
 
运行结果:
Create link list...
The link list data is:
3
6
9
12
15
18
21
24
27
30
After reversed,the link list data is:
30
27
24
21
18
15
12
9
6
3
Destroy the link list...

抱歉!评论已关闭.