两两交换链表的节点

两两交换链表节点

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

给定 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;
    }
};
posted @ 2020-10-13 12:24  wsl-hitsz  阅读(110)  评论(0编辑  收藏  举报