LeetCode算法题——反转链表

题目:
反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

迭代方法思路:
用一个指针保存向前的方向,用两个指针做方向转换。即从正方向头结点开始遍历,将链表断开两截,每两个节点调转指针方向做反转。答案范例的方法会绕的有点晕,我自己写的相对比较清晰,但是需要多创建几个指针,在链表结尾加一个节点避免访问空指针,并且链表节点小于3的情况要特殊处理。

自己实现的代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL)
            return head;
        
        ListNode *flag = head;//链表预处理,求出链表的长度,并且在链表末尾加一个节点
        int idx = 0;
        while(flag->next != NULL) {
            flag = flag->next;
            idx++;
        }
        if(idx == 0)
            return head;
        if(idx == 1)
        {
            flag->next = head;
            head->next = NULL;
            return flag;
        }
        ListNode *k = new ListNode(0);
        flag->next = k;
        
        ListNode *right = head;//创建指针,开始反转操作
        right = right->next;
        ListNode *pre = right->next;
        ListNode *left = head;
        ListNode *tmp = left;
        
        left->next = NULL;
        
        for (int i = 0; i < idx; i++)
        {
            right->next = tmp;
            tmp = right;
            right = pre;
            pre = pre->next;
            
        }
        return tmp;
    }
};

答案范例的代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head) return head;
        ListNode *dummy = new ListNode(-1);
        dummy->next = head;
        ListNode *cur = head;
        while (cur->next) {
            ListNode *tmp = cur->next;
            cur->next = tmp->next;
            tmp->next = dummy->next;
            dummy->next = tmp;
        }
        return dummy->next;
    }
};

递归方法:

// Recursive
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode *p = head;
        head = reverseList(p->next);
        p->next->next = p;
        p->next = NULL;
        return head;
    }
};

你可能感兴趣的:(LeetCode解题)