首页 两两交换链表中的节点
文章
取消

两两交换链表中的节点

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

注意

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

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

分析

该题属于基本的链表操作题。

  • 设置一个虚拟头结点dummyHead
  • 设置需要交换的两个节点分别为node1、node2,同时设置node2的下一个节点next

在这一轮操作中

  • 将node2节点的next设置为node1节点
  • 将node1节点的next设置为next节点
  • 将dummyHead节点的next设置为node2
  • 结束本轮操作

接下来的每轮操作都按照上述进行。

动画描述

代码实现

1
2
3
4
5
6
7
8
9
10
public class ListNode {
    
    public var val: Int
    public var next: ListNode?
    public init(_ val: Int) {
        
        self.val = val
        self.next = nil
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func swapPairs(_ head: ListNode?) -> ListNode? {
        
    let dummyHead = ListNode(0)
    dummyHead.next = head

    var preNode: ListNode? = dummyHead
    var curNode = dummyHead.next

    while curNode != nil && curNode!.next != nil {

        let next = curNode!.next
        let post = curNode!.next!.next

        preNode!.next = next
        next!.next = curNode
        curNode!.next = post

        preNode = curNode
        curNode = post
    }

    return dummyHead.next
}

源码地址

本文由作者按照 CC BY 4.0 进行授权

合并两个有序的链表

删除排序数组中的重复项