您的位置:首页 > 其它

LeetCode-206 Reverse Linked List

2016-06-18 11:35 423 查看
https://leetcode.com/problems/reverse-linked-list/

Reverse a singly linked list.
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?

1、非递归,头插法实现逆序(8ms)

/**

 * 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) {

        ListNode *rHead = NULL;

        ListNode *temp;

        while(head != NULL){

            temp = head->next;

            head->next = rHead;

            rHead = head;

            head = temp;

        }

        return rHead;

    }

};

2、递归,如下所示:(8ms)

The recursive version is slightly trickier and the key is to work backwards. Assume that the rest of the list had already been reversed, now how do I reverse the front part? Let's assume the list is:
n1 → … → nk-1 → nk →
nk+1 → … → nm → Ø

Assume from node nk+1 to nm had
been reversed and you are at node nk.

n1 → … → nk-1 → nk →
nk+1 ← … ← nm

We want nk+1’s next node to point to nk.

So,

nk.next.next = nk;

Be very careful that n1's next must point to Ø. If you forget about this, your linked list has a cycle in
it. This bug could be caught if you test your code with a linked list of size 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 * p = reverseList(head->next);

        head->next->next = head;

        head->next = NULL;

        return p;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode