206 - Reverse Linked List

#easy

Given the head of a singly linked list, reverse the list, and return the reversed list.

Example 1:

Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]

KEY POINT: 注意一開始頭尾巴要接NULL

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if ( head == NULL ) return NULL;
        ListNode * it_node = head;
        ListNode * n_node = NULL;
        if ( head -> next == NULL ) return head;
        else n_node = head -> next;
        ListNode * nn_node = NULL;
        while ( it_node != NULL )  {
            if ( n_node -> next != NULL ) {
                nn_node = n_node -> next;
                n_node -> next = it_node;
                it_node = n_node; 
                n_node = nn_node;
            }
            else {
                n_node -> next = it_node;
                // 注意一開始頭尾巴要接NULL
                head -> next = NULL;
                head = n_node;
                break;
            }

        }   

        return head;
    }
};

it_node -> n_node -> nn_node

  • it_node -> n_node -> nn_node
**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode * pre = NULL;
    ListNode * traversal( ListNode * head, ListNode * pre ) {
        if ( head == NULL ) return pre; 
        ListNode * temp = head -> next;
        head -> next = pre;
        return traversal( temp, head );
    }

    ListNode* reverseList(ListNode* head) {
        // if ( head == NULL ) return NULL;
        // stack<ListNode*> st;
        // while( head != NULL ) {
        //     st.push( head );
        //     head = head -> next;
        // }

        // head = st.top();
        // ListNode * node = head;
        // st.pop();
        // while( !st.empty() ) {
        //     ListNode * node_next = st.top();
        //     st.pop();
        //     node -> next = node_next;
        //     node_next -> next = NULL;
        //     node = node_next;
        // }

        // return head;
        return traversal( head, NULL );
    }
};


// class Solution {
// public:
//     ListNode* reverseList(ListNode* head) {
//         ListNode* temp; // 保存cur的下一個節點
//         ListNode* cur = head;
//         ListNode* pre = NULL;
//         while(cur) {
//             temp = cur->next;  // 保存一下 cur的下一個節點,因為接下來要改變cur->next
//             cur->next = pre; // 翻轉操作
//             // 更新pre 和 cur指針
//             pre = cur;
//             cur = temp;
//         }
//         return pre;
//     }
// };
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head){
    if ( head == NULL ) return NULL;
    struct ListNode * prev = NULL;
    struct ListNode * cur = head, *next = head;
    while ( cur != NULL ) {
        next = cur -> next;
        cur -> next = prev;
        prev = cur;
        cur = next;
    }    

    return prev;
}