• 两两交换链表的节点


    两两交换链表节点

    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
    例如:

    给定 1->2->3->4, 你应该返回 2->1->4->3。

    在看到这道题目的时候,我感觉很简单,可能就是边界条件需要注意一下,我们需要一个指针在整个链表上进行移动,这个指针每次都是移动两步。这样的话基本就可以实现两两交换
    代码如下

    class Solution {
    public:
        ListNode* swapPairs(ListNode* head) {
            if (head == nullptr || head->next == nullptr)
                return head;
            ListNode* dummy = new ListNode(-1);
            dummy->next  = head;
            ListNode* pre = dummy->next;
            ListNode* next = pre ->next;
            while (pre && next){
                int temp = next->val;
                next->val = pre->val;
                pre->val = temp;
                pre = pre->next->next;
                if (pre)
                    next = pre ->next;
            }
            return dummy->next;
        }
    };
    

    实现了两两互换,但是发现运行的效率非常的低,双(5\%),看见了题目的要求:你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换

    在具体实现上,我们创建头结点,然后在交换上,改变节点之间的连接关系那么就需要这两个需要交换顺序节点的先前结点,在下面的程序中,temp节点其实就是那个先前的节点。在进行交换的时候,需要设置两个变量对需要交换的节点进行记录。方便我们的实现。

    class Solution {
    public:
        ListNode* swapPairs(ListNode* head) {
            ListNode* dummyHead = new ListNode(0);
            dummyHead->next = head;
            ListNode* temp = dummyHead;
            while (temp->next != nullptr && temp->next->next != nullptr) {
                ListNode* node1 = temp->next; // pre
                ListNode* node2 = temp->next->next; // next
                temp->next = node2;
                node1->next = node2->next;
                node2->next = node1;
                temp = node1;
            }
            return dummyHead->next;
        }
    };
    
  • 相关阅读:
    C++(四十)— C++中一个class类对象占用多少内字节
    C++(三十九) — 主函数中增加调试信息
    C++(三十八) — 继承方式、访问控制、构造和析构、虚继承
    ambari部署Hadoop集群(1)
    小波分析和多尺度几何分析
    正则化与矩阵范数
    设计模式之:创建型设计模式
    设计模式六大原则(详细)
    UML类关系(依赖,关联,聚合,组合,泛化,实现)
    SSD详解
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/13807924.html
Copyright © 2020-2023  润新知