剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
方法一:非递归 三指针法 。此方法使用三个指针 改变了第二个指针的指向,将第二个指针指向第一个指针,通过第三个指针调整位置,从而反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head || !(head->next)) return head;
ListNode* p1 = nullptr;
ListNode* p2 = head;
ListNode* p3 = head->next;
while(p2){
p2->next=p1;
p1 = p2;
p2 = p3;
if(p3)
p3 = p3->next;
}
return p1;
}
};
方法二:使用递归 同三指针法的原理 只不过递归方法是从尾部开始改变指向 由前递归返回
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head || !(head->next)) return head;
ListNode* tail = head->next,*p = reverseList(head->next);
head->next = tail->next;
tail->next = head;
return p;
}
};