206. 反转链表

206. 反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
  • 迭代做法

    首先定义三种指针,cur表示当前遍历的位置,prev表示cur的上一轮位置,nex指针用来提前存储好下一次的位置。显然,为了反转链表,需要cur指针每一轮更新,都要指向prev指针。提前存好cur的下一轮位置(即nex),是为了避免当前cur指针指向prev后,后续的位置丢失。迭代最后cur会变为空指针,返回prev。

ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* prev = nullptr;
        while(cur){
            ListNode* nex = cur -> next;
            cur -> next = prev;
            prev = cur;
            cur = nex;
        }
        return prev;
    }
  • 递归做法
    递归需要调用原函数本身,对于单向链表结构,显然只可能调用reverseList(head->next)。以下举一个例子:
    比如当前输入是head = {2,3,4,5},那么调用reverseList(head->next)的正确返回值是{5,4,3},而当前输入的正确返回值是{5,4,3,2}。此时我们需要将3->next = 2,2->next = nullptr。这里需要对链表结构有一些直觉,发现其实当前输入head的地址停留在2,且它的下一个地址即3,那么3->next = 2可以写为head->next->next = head, head->next = nullptr。最后是递归终止条件,这个比较容易想到。
ListNode* reverseList(ListNode* head) {
        if(!head || head->next == nullptr)
            return head;
			
        ListNode* ans = reverseList(head->next);
        head -> next -> next = head;
        head->next = nullptr;
        return ans;
    }
posted @ 2021-04-11 11:46  andymori  阅读(57)  评论(0)    收藏  举报