题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
思路分析:
我这里没有设置虚拟节点,直接在原链表上进行模拟。使用三个指针pre、cur、temp,
pre.next=cur,cur.next=temp,每次模拟只需要判断temp的值。
如果temp为空,证明后面没有节点了,cur指向pre,pre指向nil后,直接返回结果。
如果temp.Next为空,证明链表最后只剩下一个节点了,cur指向pre,pre指向temp后,直接返回结果。
如果temp.Next不为空,证明链表后面还有至少两个指针,cur指向pre,pre指向temp.next后,移动pre cur
temp指针后继续模拟。
代码实现:
func swapPairs(head *ListNode) *ListNode {
pre:=head
if pre==nil{//如果链表为空的话,直接返回
return head
}
cur:=pre.Next
if cur==nil{//如果链表中只有一个节点的话,直接返回
return head
}
temp:=cur.Next
head=head.Next//head永远指向原链表的第二个节点,因为第二个节点会成为交换后的头节点,直接返回head即可
flag:=false
for flag==false{
if temp==nil{//后续已经没有节点需要模拟了
pre.Next=nil
cur.Next=pre
flag=true//设置退出循环变量
}else if temp.Next==nil{//后续节点只剩下一个,即temp就是最后一个元素了。
cur.Next=pre
pre.Next=temp
flag=true//设置退出循环变量
}else if temp.Next!=nil{//后面至少还有两个节点,可以继续转换链表
cur.Next=pre
pre.Next=temp.Next
pre=temp
cur=temp.Next
temp=cur.Next
}
}
return head//返回头节点
}