题意描述:
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。
然后就要开始翻转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
双指针法代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp;
ListNode* cur = head;
ListNode* pre = NULL;
while(cur){
temp = cur->next;
cur->next = pre;
pre = cur;
cur =temp;
}
return pre;
}
};
递归法:
递归法逻辑与双指针法相同,都是当cur为NULL时停止循环,之后每次将cur指向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);
}
};