单链表反转的几种方法

反转链表,将单链表倒置输出
这个也算是很多面试题里常考的题,刚复习完单链表在这记录一下这几种方法,做个笔记

    //链表反转1 创建一个新的链表,遍历原链表头插到新链表
    LinkedList listReverseList(LinkedList L)
    {
        LinkedList temp = L->next;
        LinkedList start = listCreatNode(NULL);//创建一个新的链表
        if(start == NULL)
        {
            perror("listCreatNode err");
            return NULL;
        }
        while(temp)
        {
            LinkedList node = listCreatNode(temp->data);
            if(node == NULL)
            {
                perror("listCreatNode err");
                return NULL;
            }
            node->next = start->next;
            start->next = node;
            temp = temp->next;
        }
        return start;
    }
    //
    int listReverseList2(LinkedList L)
    {
        /*
        * 先让头结点下一跳指向第三个结点,然后让第二个结点指向第四个结点
        * 最后让第三个结点的下一跳指向第二个结点
          从第二个结点开始,每次循环向后步进一,把这个结点头插到头结点后边
          H-->N2-->N3-->N4-->N5
          H-->N3-->N2-->N4-->N5
          H-->N4-->N3-->N2-->N5
          H-->N5-->N4-->N3-->N2
        */
        LinkedList temp = L->next;  //指向第二个结点
        LinkedList p = NULL;        //中间变量

        while(temp->next)           //从第二个结点开始遍历
        {
            p = temp->next;         //指向当前操作结点
            temp->next = p->next;   //让前一结点下一跳指向后一结点(对操作结点来说)
            p->next = L->next;      //让操作结点下一跳指向前一结点(头插法)
            L->next = p;            //头结点的下一跳指向操作结点(操作结点与第二结点互换了)
        }
        return 0;
    }
    //
    int listReverseList3(LinkedList L)
    {
        /*
        * 让下一个结点指向上一个结点,第一个结点指向NULL
        */
        LinkedList temp = L->next;  //指向第二个结点
        LinkedList p = NULL;        //中间变量
        LinkedList n = NULL;        //新链表终结点

        while(temp)             //让下一个结点指向上一个结点
        {
            p = temp->next;     //p指向temp的下一个结点
            temp->next = n;     //下一个指向上一个(第一次时指向NULL,作为终结点)
            n = temp;           //新链表向后移
            temp = p;           //
        }
        L->next = n;
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值