论文网
English Papers
万事OK网
发表论文
 
 首页 > IT文章 > 程序设计 >
链表反转的两种实现方法

[科技论文网] http://www.scipapers.com    2007-12-01  

    链表反转的两种实现方法

    对于链表的讨论似乎永远都不会过时。虽然现在有了容器,但是一味的使用它们,也使自己失去了锻炼的机会。前不久被导师问及链表反转的问题,结果编码、调试,费了好大功夫才算完成了。而且,代码还没得到优化,完善。想不到许久没碰指针,对指针的操作竟生疏了不少。看来对技术的学习,真的不能放松啊~!

    把代码简单整理下,大家参考:

    #include <iostream>

    using namespace std;

    //元结点
    struct Node
    {
        int data;
        Node *next;
    };

    //链表反转(循环方法)
    Node *Reverse(Node *head)
    {
        Node *prev = NULL;
        Node *cur = NULL;
        Node *next = head;

        for (; next != NULL; )
        {
            cur = next;
            next = cur->next;
            cur->next = prev;
            prev = cur;
        }

        return prev;
    }

    //链表反转(递归方法)
    Node *Reverse2(Node *head)
    {
        if (!head)
        {
            return NULL;
        }

        Node *temp = Reverse2(head->next);

        if (!temp)
        {
            return head;
        }

        head->next->next = head;
        head->next = NULL;

        return temp;
    }

    //创建链表
    Node *Construct(int *const array, int len)
    {
        Node *pre = NULL, *head = NULL;

        for (int i = len; i > 0; i--)
        {
            if (!pre)
            {
                head = new Node;
                head->data = array[len - i];
                head->next = NULL;
                pre = head;
            }
            else
            {
                pre->next = new Node;
                pre = pre->next;
                pre->data = array[len - i];
                pre->next = NULL;
            }
        }

        return head;
    }

    //销毁链表
    void Destruct(Node *head)
    {
        Node *cur = head, *temp = NULL;

        while (cur)
        {
            temp = cur;
            cur = cur->next;
            delete temp;
        }
    }

    //打印链表
    void Print(Node *head)
    {
        Node *cur = head;

        for (; cur != NULL; cur = cur->next)
        {
            cout << "data: " << cur->data << endl;
        }
    }

    int main(int argc, char* argv[])
    {
        Node *head = NULL;
        int array[] = {1, 3, 5, 7, 9, 10, 8, 6, 4, 2};

        cout << endl << "Construct!" << endl << endl;
        head = Construct(array, 10);
        Print(head);
        cout << endl << "Reverse!" << endl << endl;
        head = Reverse(head);
        Print(head);
        cout << endl << "Reverse2!" << endl << endl;
        head = Reverse2(head);
        Print(head);
        cout << endl << "Destruct!" << endl << endl;
        Destruct(head);
        head = NULL;
        Print(head);

        return 0;
    }

    界图如下:

        来源:

声明:本文由网友推荐或作者提交,版权归原作者所有,刊登此文仅为传播知识,展示研究成果,提高文章引用率。未经原作者授权,禁止用于任何形式的商业行为。科技论文网倡导尊重知识、尊重劳动、保护原创、知识共享。由于部分论文文章来于网络,文章作者不祥,请相关的原创作者与我们联系,以便加上您的署名。

  
链表反转的两种实现方法
下面没有链接了     数据结构(C语言):迷宫问题
最新论文
·[程序设计]链表反转的两种实现方法
·[程序设计]数据结构(C语言):迷宫问题
·[程序设计]"S/P先生数学谜题"算法分析及源代码
·[程序设计]单源最短路径bellman-ford算法
·[程序设计]前序遍历二叉树
·[程序设计]哈夫曼树的构造方法与原理
·[程序设计]排列组合算法
·[程序设计]走迷宫程序
·[程序设计]红黑树分析和实现
·[程序设计]最小堆/哈希表/二叉树/平衡二叉树/红黑树
 
 

搜索论文

Google
论文分类

论文网 论文发表网 论文 免费论文网 找论文网 毕业论文 中国论文网 英语论文 百度论文 聘教网 易搜
 免费发布论文    中国论文网 2008版权所有  业务联系:pinjiao@126.com