LintCode 532: Reverse Pairs

LintCode 35: Reverse Linked List

题目描述

翻转一个链表。

样例

给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null

Thu Sep 21 2017

思路

本题的思路很多,今天把之前的方法改进了一下,使用两个指针就可以达到目的了(实际上也用了三个指针,但之前的方法太繁琐了)。

翻转链表的本质是将原本的“箭头”反转,这个操作在只有两个元素的时候很好实现,就一条赋值语句即可。而到了多个元素的时候,只需多考虑一下怎么暂存指针地址,避免链表“断掉”后找不到节点的情况就行了。

代码

// 反转链表
class Solution {
public:
    /**
     * @param head: The first node of linked list.
     * @return: The new head of reversed linked list.
     */
    ListNode* reverse(ListNode* head)
    {
        ListNode* pNewHead;
        if (head == NULL || head->next == NULL) return head;
        ListNode *p1 = head, *p2 = head->next;
        while (p2 != NULL)
        {
            ListNode* p3 = p2->next;
            p2->next = p1;
            p1 = p2;
            p2 = p3;
        }
        pNewHead = p1;
        head->next = NULL;
        return pNewHead;
    }
};

Mon Mar 6 2017

思路

这道题的方法就很多了,我这里第一想到的就是用三个指针来实现,可能我以前这么实现过吧。

不过这个方法并不是最优的方法,还可以用两个指针,或者递归实现,这些坑以后再补吧。

代码

// 反转链表
class Solution {
public:
    /**
     * @param head: The first node of linked list.
     * @return: The new head of reversed linked list.
     */
    ListNode *reverse(ListNode *head) {
        ListNode* ans;
        if (head == NULL || head->next == NULL) return head;
        else if (head->next->next == NULL)
        {
            head->next->next = head;
            ans = head->next;
            head->next = NULL;
            return ans;
        }
        ListNode *p1 = head, *p2, *p3;
        while(1)
        {
            p2 = p1->next;
            p1 = 
        }
    }
    ListNode *reverse(ListNode *head) {
        ListNode* ans;
        if (head == NULL || head->next == NULL) return head;
        else if (head->next->next == NULL)
        {
            head->next->next = head;
            ans = head->next;
            head->next = NULL;
            return ans;
        }
        ListNode* p1 = head, *p2 = NULL, *p3 = NULL;
        while(1)
        {
            if (p1 != NULL && p1->next != NULL && p1->next->next != NULL)
            {
                p2 = p1->next;
                p1->next = p3;
                p3 = p2->next;
                p2->next = p1;
                p1 = p3->next;
                p3->next = p2;
                continue;
            }
            else if (p1 != NULL && p1->next != NULL && p1->next->next == NULL)
            {
                ans = p1->next;
                ans->next = p1;
                p1->next = p3;
            }
            else if (p1 != NULL && p1->next == NULL)
            {
                ans = p1;
                ans->next = p3;
            }
            else
            {
                ans = p3;
            }
            break;
        }
        head->next = NULL;
        return ans;
    }
};
posted @ 2016-10-13 18:04  GenkunAbe  阅读(293)  评论(0编辑  收藏  举报