大家好呀,我是蛋蛋。
今天开搞交换链表,和反转链表一样,也是必考的“老熟人”。
话不多说,直接开工。
LeetCode 24:交换链表
题意
两两交换链表相邻节点的值,返回交换后的链表。
示例
输入:head = [1, 2, 3, 4]
输出: [2, 1, 4, 3]
提示
-
0 <= 链表节点数 <= 100
-
0 <= Node.val <= 100
题目解析
水题,难度中等。
这道题要求不能只是单纯的改变节点内部得值,需要进行实际的节点交换。
和反转链表一样,这类链表题思维上没有难度,就是每次从链表上截取两个节点进行交换。
主要是考察代码实现能力。
这道题我用带虚拟头节点的单链表实现。
虚拟头节点(其实我以前都叫头节点,后来有臭宝和我说容易看混,我就叫虚拟头节点),可能很多人叫做哨兵节点,放在第一个元素的节点之前,数据域一般没意义。
图解
先建立一个带虚拟头节点的单链表。
PS:此处代码为 Python(”代码实现“小节处有 Java 代码,下同)。
# 链表节点类
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# 创建虚拟节点
dummyHead = ListNode(-1)
因为每次要截取两个节点进行交换,初始建立 3 个指针 pre,p 和 q。
其中 pre 指向虚拟头节点,p 指向链表首节点,q 指向链表的第 2 个节点。
pre = dummyHead
p = head
q = p.next
节点两两交换主要分为 3 步。
第 1 步:pre 的后继指针 next 指向 q,即 pre.next = q。