本题出自LeetCode第206题
最普通的方法,无非是找一中间量,用于二者之间的置换,采用双指针;
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur=head,* pre=NULL,* temp;//trmp用于保存cur的下一个节点
while(cur){
temp=cur->next;//由于下一句,需要改变cur->next,这里先保存一下
cur->next=pre;//翻转
//更新pre和cur指针
pre=cur;
cur=temp;
}
return pre;
}
};
首先定义一个cur指针,指向头节点,再定义一个pre指针,初始化为NULL。
然后就开始翻转了,要定义一个链表指针temp保存一下cur->next。(因为接下来要改变cur->next的指向,将cur->next指向pre,此时已经反转了第一个节点)
接下来,将pre保存已经反转的cur,再将cur指向最初保存的temp中间变量。
重复以上代码逻辑,最后,cur指针指向NULL循环结束,链表就完成了反转,并保存于pre链表中。
接下来是递归法:
class Solution {
public:
ListNode* reverse(ListNode* pre,ListNode* cur){
if(cur == NULL) return pre;
ListNode* temp = cur->next;
cur->next = pre;
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
// pre = cur;
// cur = temp;
return reverse(cur,temp);
}
ListNode* reverseList(ListNode* head) {
// 和双指针法初始化是一样的逻辑
// ListNode* cur = head;
// ListNode* pre = NULL;
return reverse(NULL, head);
}
};
初始化逻辑与双指针法一致,递归逻辑在reverse函数中