两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:

输入:head = []
输出:[]
示例 3:

输入:head = [1]
输出:[1]

想法一:从这两个例子(反转链表)当中我们可以看出来一般对链表进行操作的时候增加一个空头的好处很多(可以解决多余一个指针的指向问题),所以这个题目仍然是这样的:

复制代码
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* newnode = new ListNode(0);//新建一个空头
        newnode->next = head;//空头加入这个链表
        ListNode* cur = newnode;//下面开始对这个链表进行操作,需要一个操作节点
        while (cur->next != NULL && cur->next->next != NULL) {//至少要有三个节点才能进行操作
            ListNode* onode = cur->next;//接下来的三个操作是为了记录需要操作的节点
            ListNode* snode = cur->next->next;
            ListNode* tnode = cur->next->next->next;
            cur->next = snode;
            snode->next = onode;
            onode->next = tnode;
            cur = onode;
        }
        return newnode->next;//返回空头的下一个节点也就是答案
    }
};
复制代码

 

posted @ 2022-09-13 20:22  铜锣湾陈昊男  阅读(2)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示