面试题24:反转链表(C++)

题目地址:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/

题目描述

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

题目示例

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解题思路

双指针:使用双指针pre和cur,分别表示当前节点的前一个结点和当前遍历的节点。具体操作定义临时指针tmp,用于存放当前指针cur所指的下一节点,即tmp = cur->next,然后让当前指针cur指向pre,再将cur的值交予pre,最后,将tmp赋值给cur,进行下一轮操作,直到cur到链表尾部。

递归:使用递归函数递归到链表的最后一个节点,将该节点作为反转后链表的头节点,然后,在每次函数返回过程中,让当前节点的下一节点的next指向当前节点,同时,让当前节点的next指向空,从而实现链表的反转操作。

参考文章:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-yi-dong-de-shuang-zhi-zhen-jia/

程序源码

双指针

/**
 * 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) return head; //空链表
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur != nullptr)
        {
            ListNode* tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
};

递归

/**
 * 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* rev = reverseList(head->next);
       head->next->next = head;
       head->next = NULL;
       return rev;
    }
};

猜你喜欢

转载自www.cnblogs.com/wzw0625/p/12536744.html