Leetcode24 两两交换链表中的节点

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

示例:

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

说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 【解题思路】

要交换两个节点,首先需要两个指针指向这两个节点。其次因为头结点可能会发生变动,因此这种情况一般都要引入一个表头节点。具体思路见下图解:

1.新建一个表头节点,然后用它来初始化两个用来交换节点的指针:

2.按照上图1、2、3三步来进行节点顺序的更换,注意顺序问题!!必须仔细检查每一步的链表是否断开和连接?像这里很容易忽略第三步。

3.然后接着进行指针的转移:

4.不断循环,直到终止条件

5. 那么如何判断终止条件?虽然有奇数和偶数两种情况,在每次 left 移位到新的位置上时, 要同时判断left->next和left->next->next是否等于空?只要有一个为空,则停止循环。

【代码实现】

代码中我用的是pre、slow和fast:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==NULL || head->next==NULL)
            return head;
        ListNode* pre = new ListNode(-1);
        ListNode* NewH = head->next;
        pre->next = head;
        ListNode* slow;
        ListNode* fast;
        while(pre->next && pre->next->next){
            slow = pre->next;
            fast = pre->next->next;
            slow->next = fast->next;
            fast->next = slow;
            pre->next = fast;
            pre = slow;
        }
        return NewH;
    }
};

猜你喜欢

转载自blog.csdn.net/zpznba/article/details/83903355