一:双指针法
两个指针
cur 表示当前处理指针
per 表示当前处理结点的前驱指针
需要完成的任务就是:
通过循环:依次把两个结点指向反转,然后per和cur两个指针需要向后移动一位来反转其他指针
因为将链表反转,a需要指向NULL,
所以per初始化
per = nullptr;
先从head开始循环:cur = head;
第一次循环:
然后per和cur需要向后移动一位:
此时就需要创建一个临时指针temp
per->next = a;
cur->next = b;//注意这里cur->next再反转阶段已经指向了a所以不能用cur->next,需要创建一个临时指针temp = cur->next(再反转操作之前)
b = temp;
这样第一遍循环就完成了
完整代码:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* per = nullptr;
ListNode* cur = head;
ListNode* temp;
while(cur)
{
temp = cur->next;
cur->next = per;
per = cur;
cur = temp;
}
return per;
}
二:递归
写递归的时候根据双指针的解题思路来理解就会比较简单
class Solution {
public:
ListNode* reverse(ListNode* cur,ListNode* per)
{
ListNode* temp;
if(!cur) return per;
temp = cur->next;
cur->next = per;
reverse(temp,cur);
}
ListNode* reverseList(ListNode* head) {
ListNode* per = nullptr;
ListNode* cur = head;
reverse(head,nullptr);
}
};