0
点赞
收藏
分享

微信扫一扫

leetcode-24. 两两交换链表中的节点

凛冬已至夏日未远 2022-04-08 阅读 29

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

方法一:递归

用 head 表示原始链表的头节点,新的链表的第二个节点;
用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。
令 head.next = swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。
然后令 newHead.next = head,即完成了所有节点的交换。
最后返回新的链表的头节点 newHead。
c++实现:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if (head == nullptr || head->next==nullptr){
            return head;
        }
        //newHead 表示新的链表的头节点,原始链表的第二个节点
        ListNode* newhead = head->next;
        //将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。
        head->next = swapPairs(newhead->next);
        //newHead.next = head,即完成了所有节点的交换
        newhead->next=head;
        //返回新的链表的头节点 newHead。
        return newhead;
    }
};

golang实现

func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next==nil {
        return head
    }
    //newHead 表示新的链表的头节点,原始链表的第二个节点
    newhead := head.Next
    //将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。
    head.Next = swapPairs(newhead.Next)
    //newHead.next = head,即完成了所有节点的交换
    newhead.Next = head
    //返回新的链表的头节点 newHead。
    return newhead
}

复杂度分析

方法二:迭代

创建哑结点 dummyHead,令 dummyHead.next = head。
令 temp 表示当前到达的节点,初始时 temp = dummyHead。每次需要交换 temp 后面的两个节点。

如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。

具体而言,交换之前的节点关系是 temp -> node1 -> node2,交换之后的节点关系要变成 temp -> node2 -> node1,因此需要进行如下操作。

完成上述操作之后,节点关系即变成 temp -> node2 -> node1。再令 temp = node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。

两两交换链表中的节点之后,新的链表的头节点是 dummyHead.next,返回新的链表的头节点即可。

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
       ListNode *dummynode = new ListNode(0);
       dummynode->next=head;
       ListNode *temp = dummynode;
       while (temp->next != nullptr && temp->next->next != nullptr){
           ListNode *node1 = temp->next;
           ListNode *node2 = node1->next;
           temp->next = node2;
           node1->next = node2->next;
           node2->next=node1;
           temp = node1;
       }
       return dummynode->next;
    }
};
func swapPairs(head *ListNode) *ListNode {
    //定义哑节点
    dummynode := &ListNode{0,head}
    temp := dummynode
    for temp.Next != nil && temp.Next.Next != nil {
        node1 := temp.Next
        node2 := temp.Next.Next
        temp.Next = node2
        node1.Next = node2.Next
        node2.Next = node1
        temp = node1
    }
    return dummynode.Next
}

复杂度分析

举报

相关推荐

0 条评论