【LeetCode】206. 反转链表 递归/迭代/双指针的方法 据说这一题可以卡掉80%的候选人

206. 反转链表
反转一个单链表。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

递归就是对双指针的方法进行改写 是一个思想

  • 说是双指针 其实是三指针 第三个指针保存着断了连接的后序链表首地址
  • cur指针指向当前需要掉换方向的结点 pre指针指向cur即将指向的那个前结点
  • pre初始化为NULL,cur初始化为head,tmp保存为cur->next
  • cur->next=pre,pre=cur,cur=tmp;
  • 直到cur为空
  • ==最后返回的是pre ==

class Solution2 {
    
    //双指针
public:
    ListNode* reverseList(ListNode* head) {
    
    
        ListNode* pre=NULL;
        ListNode* cur=head;
        while(cur!=NULL){
    
    
            ListNode* tmp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=tmp;
        }
        return pre;//最后一步指针cur指向NULL,pre指向最后一个结点
    }
};

class Solution {
    
    //递归
public:

    ListNode* reverse(ListNode* cur,ListNode* pre){
    
    
        if(cur==NULL)
        return pre;

        ListNode* tmp=cur->next;
        cur->next=pre;
        //pre=cur;
        //cur=tmp;
        
        return reverse(tmp,cur);;
    }

    ListNode* reverseList(ListNode* head) {
    
    
        ListNode* cur=head;
        ListNode* pre=NULL;
        return reverse(head,pre);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_37581730/article/details/108411985
今日推荐