• LeetCode-24. Swap Nodes in Pairs


    一、问题描述

      给定一个链表,要求换他们的一对值,要求空间复杂度是常量,不能更改链表节点的值,只能更改指针。

      例子:给定一个链表,如1->2->3->4,应该返回2->1->4->3。

    二、问题解决

      看到题目大概都能明白怎么去解,关键是如何转化成简单的代码描述。复习一定看一看代码,代码中,为了减去判断头节点是否空、整个链表是否为空使用了一种简单的描述方式,可以学习:

    while ((a = *pp) && (b = a->next))

      下面是整个代码,使用了指向指针的指针来解决这个问题。还可以方式第一次交换时第一个节点没有前结点的问题(这个问题还可以参考21题新建一个头节点的解决方案)

    ListNode* swapPairs(ListNode* head) {
        ListNode **pp = &head, *a, *b;
        while ((a = *pp) && (b = a->next)) {
            a->next = b->next;
            b->next = a;
            *pp = b;
            pp = &(a->next);
        }
        return head;
    }
    
    int main()
    {
        ListNode node1(1);
        ListNode node2(2);
        ListNode node3(3);
        ListNode node4(4);
        ListNode* list1 = &node1;
        node1.next = &node2;
        node2.next = &node3;
        node3.next = &node4;
    
        ListNode* ii = swapPairs(list1);
        while (ii != NULL) {
            cout << ii->val << endl;
            ii = ii->next;
        }
    
        system("pause");
        return 0;
    }

      下面是不使用指向指针的指针,而是新建一个头节点的解决方式(同样,在代码中判断下两个节点是否都存在,使用while条件的语句简化):

    ListNode* swapPairs(ListNode* head) {
        ListNode f(-1);
        f.next = head;
        ListNode *p = &f;
        ListNode *a = head;
        ListNode *b;
        while (a && a->next) {
            b = a->next;
            a->next = b->next;
            b->next = a;
            p->next = b;
            p = a;
            a = p->next;
        }
        return f.next;
    }
  • 相关阅读:
    Qt 3d
    yolov5 检测图片里面的对象
    QTreeWidget双击事件
    Qt QPainter QBrush 填充区域
    Qt QWidget保存为图片
    [原][减肥][名词解释]什么是GI
    [原][减肥]生酮减肥,喝防弹咖啡减肥的食谱
    [转][减肥]外源性酮症与内源性生酮
    fastadmin 单独设置导入权限【转载】
    [MySQL]多表关联查询技巧
  • 原文地址:https://www.cnblogs.com/likaiming/p/8302823.html
Copyright © 2020-2023  润新知