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

迭代

将链表看成两部分,一部分是已经反转的部分,一部分是未反转的部分。为此定义两个变量:
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有点费解。可以看下面的示意图:
反转链表:迭代和递归的实现_第1张图片

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

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

你可能感兴趣的:(算法)