首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LeetCode-24. 两两交换链表中的节点(Golang)

LeetCode-24. 两两交换链表中的节点(Golang)

作者头像
bug菌
发布于 2023-08-26 16:10:23
发布于 2023-08-26 16:10:23
5950
举报

一、前言

🏆本文收录于《LeetCode每日一题》,专门攻坚算法提升,带着你一块儿刷题。

二、题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

编辑

代码语言:javascript
复制
输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

代码语言:javascript
复制
输入:head = []
输出:[]

示例 3:

代码语言:javascript
复制
输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

三、思路分析

        直接看注释,总结来说就是两个节点调换之后,(A->B来介绍)一定要保证A->Next = B->Next, B->Next = A,然后递归调换即可,注意递归传入的一定是B->Next(既是下个轮回的开始)

四、算法实现

代码语言:javascript
复制
func swapPairs(head *ListNode) *ListNode {
	//空直接返回
	if head == nil {
		return nil
	}
	//当个节点直接返回
	if head.Next == nil {
		return head
	}
	// 保存当前节点、当前节点的前置节点,最终返回的必然是第一次交换的head.Next(即:pre)
	curr, pre := head, head.Next
	// 当当前节点被交换到前置节点的位置时,当前节点的next应该是前置节点的Next
	curr.Next = swapPairs(pre.Next)
	// 前后对掉后,前置节点的next应该指向当前节点
	pre.Next = curr

	return pre
}

执行结果截图:

五、复杂度分析

  • 时间复杂度:O(n),其中 nnn 是链表的节点数量。需要对每个节点进行更新指针的操作。
  • 空间复杂度:O(1)。

六、小结

写链表题,可以多声明几个变量,把节点按顺序用 0 1 2 3 标清楚,在草稿纸上画画,就清楚多了。

七、往期推荐

  1. leetcode-9.回文数
  2. leetcode-1.两数之和
  3. leetcode-13.罗马数字转整数
  4. leetcode-14.最长公共前缀
  5. leetcode-20.有效的括号
  6. leetcode-21.合并两个有序链表
  7. leetcode-26. 删除有序数组中的重复项

《每日一题LeetCode》。

        一个人刷可能会觉得很累很难坚持,但是一群人刷就会觉得它是一件很有意义的事儿,互相督促互相鼓励,一起变强。

        我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、前言
  • 二、题目描述
  • 三、思路分析
  • 四、算法实现
  • 五、复杂度分析
  • 六、小结
  • 七、往期推荐
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档