LeetCode-206 Reverse Linked List

来源:互联网 发布:kmp算法的特点 编辑:程序博客网 时间:2024/04/27 20:46

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;
    }
};

0 0
原创粉丝点击