链表——反转链表之迭代和递归

《我是真的不熟练写链表的操作》

对于正常的迭代我能写,但是也写的非常之抠脑袋(慢慢思考)。

链表部分定义就单独放了:

struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
struct

正常的迭代我写的像是这样:

class Solution
{
public:
    ListNode *reverseList(ListNode *head)
    {
        //迭代
        if (head == NULL || head->next == NULL)
            return head;
        ListNode *n = head->next, *m;
        head->next=NULL;
        while (n)
        {
            m = n->next;
            n->next = head;
            head = n;
            n = m;
        }
        return head;
    }
};
mine

也是不出所料的非常逊,迷迷糊糊反正写出来没问题,

完美迭代逻辑是这样的:

class Solution
{
public:
    ListNode *reverseList(ListNode *head)
    {
         ListNode *n = head, *pre = nullptr;
         while (n)
         {
             ListNode *m = n->next;
             n->next = pre;
             pre = n;
             n = m;
         }
         return pre;
    }
};
perfect

u1s1,看着非常舒服。。。

 

递归版本,我是想了半天也没写出来,终归是递归写的少,像平常dfs那种都是非常熟悉的了,况且我更多写bfs版本。。。

还是太弱了,,,analysis和code一起了:

 

class Solution
{
public:
    ListNode *reverseList(ListNode *head)
    {
        /*
        analyse:
            关键是找到循环处理方式
            假设为:
                n1>n2>n3>...>n(m-1)>n(m)>0
                现在为:
                n1>n2>n3>...>n(k-1)>n(k)>n(k+1)<...<n(m-1)<n(m)

                希望n(k)下一个节点n(k+1)指向n(k)
                所以是
                    nk-next-next=nk
                    需要注意n1下一个节点必须是0

        */
        if (!head || !head->next)
            return head;
        ListNode *n = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return n;
    }
};
perfect

 

posted @ 2022-02-20 15:18  Renhr  阅读(26)  评论(0)    收藏  举报