单链表反转的几种方法

来源:互联网 发布:java认证培训 编辑:程序博客网 时间:2024/06/06 10:01

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

    //链表反转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;    }
原创粉丝点击