定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
思路:
(迭代法)
反转链表即把链表原本指向下一个元素的next指针改为指向前一个元素,所以额外创建两个指针变量更改指向。
- 预先保存当前指针本身下一个元素。
- 然后更改当前元素的next指向,改成指向向前的元素。
- 然后把两个指针分别向前移动一个元素。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* curr = head;
ListNode* next = NULL;
while (curr!=NULL)
{
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
};
(递归法)
依次遍历链表元素,对每一个元素的指向进行更改。
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
if (head == NULL||head->next==NULL) { return head; }
ListNode* last = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return last;
}
};