题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
样例
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
算法1
(迭代法)
反转链表,是将链表中每一个节点都改为指向其前驱节点,然后返回反转后链表的头节点即使原来链表的尾节点。所以需要维护当前节点的前驱last,需要更改每条边,所以需要访问链表。
时间复杂度
O(N)
C++ 代码
/**
* 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 * last = NULL;
while(head != NULL){
// 因为下面更改了head->next的值,所以这里需要保存下一个节点。
auto nextNode = head->next;
// 需要更改一条边
head->next = last;
// last,head向后移动一位
last = head;
head = nextNode;
}
return last;
}
};
算法2
(递归法)
反转链表操作将链表中每个节点指向设为其前驱节点,然后返回新的头节点即是原链表的尾节点,那么reverse(head->next)则是将head后面的节点全部反转,然后返回尾节点。此时其新的尾节点即是原链表的head->next节点,可以将其调整反转既可满足题意。
C++ 代码
/**
* 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 || head->next == NULL) return head;
ListNode * tail = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return tail;
}
};