[LeetCode] [C++] 206 Reverse Linked List 反转单项链表

题目要求


Reverse a singly linked list.
LeetCode 206在线测试

问题描述


给定一个单项链表,将其反转后返回链表头节点。

思路分析1


可以完整的遍历一遍链表,将链表的每个节点的值存在数组中,然后反向遍历数组重新生存一个新
链表。这样做需要有O(N)的空间复杂度

代码验证1

/**
 * 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 || head->next == NULL) {
            return head;
        }
        
        vector<int> nodeVals;
        for (ListNode* p = head; p != NULL; p = p->next) {
            nodeVals.push_back(p->val);
        }
        
        ListNode* pNewHead = NULL;
        ListNode* pTail = NULL;
        for (int i = nodeVals.size() - 1; i >= 0; --i) {
            ListNode* pNew = new ListNode(nodeVals[i]);
            
            if (pTail == NULL) {
                pNewHead = pNew;
                pTail = pNew;
            } else {
                pTail->next = pNew;
                pTail = pNew;
            }
        }
        
        return pNewHead;
    }
};

思路分析2


遍历一次链表,每次遍历到其中一个节点时,尝试将它链表指向改变,改成指向他前一个节点,
原来链表的首节点比较特殊,需要将它的下一个指向NULL。

具体的操作流程如下图所示:
反转链表流程演示

代码验证2

/**
 * 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 || head->next == NULL) {
            return head;
        }
        
        ListNode* pre = head;
        pre->next = NULL;
        ListNode* cur = head->next;
        ListNode* next = NULL;
        
        while (cur != NULL) {
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        
        return pre;
};

总结注意


反转链表时,可以针对当前遍历到的节点,改变当前节点的next指针指向,实现反转当前
节点的效果。而当每个节点都执行相同的操作时,就可以实现反转整条单项链表的目的

原创声明


作者:hgli_00
链接:http://www.cnblogs.com/lihuagang/p/leetcode_206.html
来源:博客园
著作权归作者所有,转载请联系作者获得授权。

posted @ 2017-04-23 13:51  hgli_00  阅读(707)  评论(0编辑  收藏  举报