两两交换链表中的节点
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例3:
输入:head = [1] 输出:[1]
思路
题目要求
- 给定一个链表,两两交换链表中的节点,不能仅交换值
- 返回两两节点交换后的链表的头节点
这道题目正常模拟节点交换操作就可以。
注意
- 设置虚拟头节点,使交换操作统一,不然的话针对头结点(没有前一个指针指向头结点),还要单独处理。
- 一定要画图,不然操作多个指针很容易乱,而且要注意操作的先后顺序:先用临时指针标记要操作的第二个节点,再操作第一个节点,然后操作第二个节点,最后操作
cur
。 - 将当前指针
cur
指向虚拟头节点,每次操作cur后面的两个节点 - 注意循环条件
代码
Go
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func swapPairs(head *ListNode) *ListNode { dummyHead := new(ListNode) dummyHead.Next = head cur := dummyHead for cur.Next != nil && cur.Next.Next != nil { temp := cur.Next.Next cur.Next.Next = temp.Next temp.Next = cur.Next cur.Next = temp cur = temp.Next } return dummyHead.Next }