算法练习-两两交换链表中的节点

96 阅读1分钟

两两交换链表中的节点

题目不难,要求间隔一个元素更换位置。

image.png

思路是三个指针: previous跟换序的元素,current跟后续链表,next跟需要换序的元素,三个指针是相邻的,先以下列顺序换值:

previous->next = next;
current->next = next->next;
next->next = current;

然后在新链表移动previous, current, next,这时previous应该指向交换后的元素(即current), 如果移动过程中发现无法为三个指针都给与合适的值,那么退出即可。

// 检查 current 是否为空
if (!current) {
    break;
}
next = current->next;

完整实现

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

        ListNode *previous = &vHead;
        ListNode *current = previous->next;
        ListNode *next = current->next;

        while (previous && current && next) {
            previous->next = next;
            current->next = next->next;
            next->next = current;

            previous = current;
            cout << previous->val << endl;;
            current = previous->next;
            
            // 检查 current 是否为空
            if (!current) {
                break;
            }
            next = current->next;

        }
        return vHead.next;
    }
};