题目地址: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指向空,从而实现链表的反转操作。
程序源码
双指针
/** * 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; } };