• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

技术天地

单链表逆序的几种方法

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/2018/1013/71.html

 

今天常州游戏开发培训工作室幻天网络来讨论下算法之-逆序链表

假设单链表数据结构定义如下:

  struct ListNode {

      int val;

      ListNode *next;

      ListNode(int x) : val(x), next(NULL) {}

  };

单链表有一个头指针指向第一个结点,最后一个结点指向NULL

 

一、最容易想到的方法,新建一个单链表newNode,每次将原先链表的第一个结点放到newNode后

 

ListNode* reverseList(ListNode* head) {

        ListNode *newNode = new ListNode(0);//新链表头结点

        ListNode *tmp;//指向原先链表的第一个结点

        newNode->next = head;

        ListNode *cur = head;

        while(cur && cur->next)

        {

        tmp = newNode->next;//保存后续结点

        newNode->next = cur->next;//将原先链表的第一个结点放到新链表中                         

        cur->next = cur->next->next;//从原先链表中摘除这个结点

        newNode->next->next = tmp;//恢复新链表中后续结点的指针

        }

        return newNode;

        

    }    

 

 

二、每次将原第一个结点后的结点放在head后面

 

 

ListNode* reverseList(ListNode* head) {

       ListNode *tmp = NULL;

       ListNode *cur = NULL;

       if(!head) return NULL;

       cur = head->next;

       while(cur)

       {

              tmp = cur->next;

              cur->next  = tmp->next;

              tmp->next = head->next;

              head->next = tmp;

       }  

        return head;

    }

 

 

三、与第二种方法类似,推荐这种方法

 

ListNode* reverseList(ListNode* head) {

        ListNode *cur = head;

        ListNode *tmp, *prev = NULL;

        while (cur)

        {

            tmp = cur->next;

            cur->next = prev;

            prev = cur;

            cur = tmp;

        }

        return prev;

    }



上篇:上一篇:合并排好序的两个链表
下篇:下一篇:单链表基本操作