【LeetCode-链表】两两交换链表中的节点

题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:

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

题目链接: https://leetcode-cn.com/problems/swap-nodes-in-pairs/

思路

使用 3 个指针:当前节点 curNode,当前节点的前一个节点 preNode,当前节点的下一个节点 nextNode。

交换两个节点的步骤如下:

  • curNode->next = nextNode->next;
  • nextNode->next = curNode;(两个节点交换完成)
  • preNode->next = nextNode;(更改 preNode 的指向)
  • pre = curNode; (更新 preNode 和 curNode)
  • curNode = curNode->next;

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==nullptr) return head;
        if(head->next==nullptr) return head;

        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* pre = dummy;
        ListNode* curNode = head;
        while(curNode!=nullptr && curNode->next!=nullptr){ // 注意条件
            ListNode* nextNode = curNode->next;
            curNode->next = nextNode->next;
            nextNode->next = curNode;
            pre->next = nextNode;
            pre = curNode;
            curNode = curNode->next;
        }
        return dummy->next;
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度:O(1)
posted @ 2020-04-10 21:52  Flix  阅读(164)  评论(0编辑  收藏  举报