当前位置: 首页 > article >正文

算法每日一练 (3)

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • 算法每日一练 (3)
    • 两两交换链表中的节点
      • 题目描述
      • 解题思路
      • 解题代码
        • `c/c++`
        • `golang`
        • `lua`

官方站点: 力扣 Leetcode

算法每日一练 (3)

两两交换链表中的节点

题目地址:两两交换链表中的节点

题目描述

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

示例 1:
在这里插入图片描述

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

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

解题思路

  • 首先处理边界条件,根据题意两两交换链表节点,那么当链表中是空或者只有一个节点时,不需要任何处理,直接返回结果即可。
  • 其次确定头节点,由于之前的判断可以明确链表中此时至少有两个节点,那么直接交换后,头节点固定就是第二个节点,那么创建结果指针变量,指向 head 节点的 next 节点,最终直接返回这个指针变量即可。
  • 创建辅助指针变量,用于交换链表节点:
    • i 指向当前需要交换的第一个节点(初始为原头节点)。
    • j 指向当前需要交换的第二个节点(初始为原第二个节点)。
    • k 指向 j 的下一个节点,即下一次交换的第一个节点。
  • while 循环中进行节点的交换,需要注意的是:由于 k 指向 j 的下一个节点,即下一次交换的第一个节点 那么当 k 或者 k.next 是空的时候有两种情况:
    • k 指针指向的节点不存在,没有可交换的节点。
    • k.next 指针指向的节点不存在,只剩下最后一个节点,不需要再进行交换。
  • 紧接着指针移动,更改链表节点位置:
    • i 指向下一个交换对的第一个节点
    • 更新 i 为下一个交换对的第一个节点
    • 更新 j 为下一个交换对的第二个节点
    • 更新 k 为下一个交换对的第一个节点
  • 当循环结束时,最终返回头指针即可。

解题代码

c/c++
struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution
{
public:
    ListNode *swapPairs(ListNode *head)
    {
        if (!head || !head->next)
            return head;

        ListNode *h = head->next;
        ListNode *i = head, *j = h, *k = h->next;

        while (true)
        {
            j->next = i;
            if (!k || !k->next)
            {
                i->next = k;
                break;
            }

            i->next = k->next;
            i = k;
            j = k->next;
            k = j->next;
        }

        return head;
    }
};
golang
package main

import "fmt"

type ListNode struct {
	Val  int
	Next *ListNode
}

func swapPairs(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return nil
	}

	h := head.Next
	i, j, k := head, h, h.Next

	for {
		j.Next = i
		if k == nil || k.Next == nil {
			i.Next = k
			break
		}

		i.Next = k.Next
		i = k
		j = k.Next
		k = j.Next
	}

	return h
}
lua
local ListNode = {}

function ListNode:new(val, next)
    local obj = {}
    setmetatable(obj, self)
    self.__index = self
    obj.Val = val or 0
    obj.Next = next or nil
    return obj
end

local function swapPairs(head)
    if head == nil or head.Next == nil then
        return head
    end

    local h = head.Next
    local i, j, k = head, h, h.Next

    while true do
        j.Next = i
        if k == nil or k.Next == nil then
            i.Next = k
            break
        end

        i.Next = k.Next
        i = k
        j = k.Next
        k = j.Next
    end

    return h
end

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述


http://www.kler.cn/a/552400.html

相关文章:

  • 使用 @Results 注解来手动指定字段映射
  • 24蓝桥省赛B-数字接龙
  • 【旋转框目标检测】基于YOLO11/v8深度学习的遥感视角船只智能检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
  • Android Studio 提示 !Failed to initialize editor
  • 力扣LeetCode: 1299 将每个元素替换为右侧最大元素
  • MySQL 窗口函数:功能、使用场景与性能优化
  • 【Arxiv 大模型最新进展】PEAR: 零额外推理开销,提升RAG性能!(★AI最前线★)
  • 【05】密码学与隐私保护
  • vue3项目实践心得-多次渲染同一svg + 理解v-if、transition、dom加载之间的顺序
  • 详解AbstractQueuedSynchronizer(AQS)源码
  • ubantu安装skywalking10.0.0
  • 人工智能 - 脑机融合:人类脑组织操控机器人,具身智能时代的革命性突破
  • Java编程语言:从基础到高级应用的全面探索
  • 构建高效矩阵系统:技术与策略全解析(可OEM)
  • 萃取的实现(三)
  • 【CSS】部分div禁用tailwindcss
  • 【Linux】(32)详解命名管道 | 日志管理 | 进程池2.0
  • WordPress自助建站全攻略
  • 快速排序C++模板,面试常考需背熟
  • 初探ai利用图片生成前端代码