反转链表:迭代和递归的实现

来源:互联网 发布:淘宝怎么上第三方活动 编辑:程序博客网 时间:2024/06/03 17:16

迭代

将链表看成两部分,一部分是已经反转的部分,一部分是未反转的部分。为此定义两个变量:
temp : 保存未反转部分的头结点
pre : 保存已经反转部分的头结点

 ListNode* reverseList(ListNode* head) {        ListNode *pre = NULL;        while(head)        {            ListNode *temp = head->next;            head->next = pre;            pre = head;            head = temp;        }                return pre;    }

递归

递归这里有点复杂,先给出代码。

 ListNode* reverseList(ListNode* head) {         //节点为空或者节点为链表末节点        if (!head || !(head -> next)) return head;        ListNode* node = reverseList(head -> next);        head -> next -> next = head;        head -> next = NULL;        return node;     }

这里的head->next->next有点费解。可以看下面的示意图:
这里写图片描述

比如说运行到第三步,value = 2为头结点,这个节点保存了value = 3这个节点的位置。value = 3这个节点已经被反转了,作为已经反转的部分的尾节点,所以需要将value = 2这个节点加到value这个节点的后边,然后将value = 2的next设置为NULL。

需要明白这一点,才能写出这个反转链表的递归。

原创粉丝点击