题目:两两交换链表中的节点
解决方法
思路分析
- 让虚拟头结点指向链表,设置前置节点pre指向第一个节点
- 从第一个节点开始作为当前节点tmp,指向其.next.next节点,目的是去掉其后的节点(注意,要先提前保存好这个要去掉的结点),然后将去掉的节点插入到当前节点前(即:pre节点后),这就完成了当前节点的反转。
- 然后让pre=tmp,tmp=tmp.Next(即:当前节点向下走一个),接着参照步骤2,与其后的节点进行反转
- 注意:停止循环的条件,要考虑到tmp.Next.Next是否为nil,因为只有tmp.Next.Next存在的时候,才需要把tmp.Next和tmp自己进行交换
Go代码
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
dummyNode := &ListNode{}
dummyNode.Next = head
pre := dummyNode
tmp := head
for {
next := tmp.Next
tmp.Next = tmp.Next.Next
next.Next = tmp
pre.Next = next
// 注意tmp.Next.Next == nil条件,因为两两交换tmp需要指向tmp.Next.Next才能把tmp后面的值取下来进行交换
if tmp.Next == nil || tmp.Next.Next == nil{
break
}
pre = tmp
tmp = tmp.Next
}
return dummyNode.Next
}
画图说明


该文章详细解析了如何使用Go语言解决LeetCode上的第24题,即两两交换链表中的节点问题。通过创建虚拟头结点,设置前置节点和当前节点,逐步交换节点实现链表的两两反转。提供的Go代码实现了这一算法,并在循环中注意了边界条件的处理。






