力扣题目学习笔记(OC + Swift)24. 两两交换链表中的节点

24. 两两交换链表中的节点

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

方法一、递归

首先定义递归终止条件:

  • head.next不存,代表链表结束了
  • head.next.next不存在,表示不能两两配对

Swift

swift 复制代码
func swapPairs(_ head: ListNode?) -> ListNode? {
        //递归实现,抽象
        //终止条件就是当结束or只剩一个时,终止
        if head == nil || head?.next == nil {
            return head
        }
        
        let newHead:ListNode? = head?.next
        head?.next = swapPairs(newHead?.next)
        newHead?.next = head
        
        return newHead
    }

OC

c 复制代码
- (ListNodeOC * _Nullable)swapPairs:(ListNodeOC * _Nullable)head {
    //递归终止条件
    if (!head.next || !head.next.next) {
        return head
    }
    
    ListNodeOC *freshHead = [ListNodeOC alloc] initWithVal:0];
    while(head.next && head.next.next) {
        head.next = swapPairs(freshHead.next);
        freshHead.next = head;
    }
    
    return freshHead;
}

方法二、迭代

用到了解决链表问题的三把斧:哑巴节点、栈、前后指针,用tempNode标记,按步进为2向后迭代,依次两两交换

Swift

swift 复制代码
func swapPairs(_ head: ListNode?) -> ListNode? {
        //哑巴节点
        let dummyNode = ListNode(0)
        dummyNode.next = head;
        
        var tempNode:ListNode? = dummyNode
        
        while tempNode?.next != nil && tempNode?.next?.next != nil {
            let fir = tempNode?.next
            let sec = tempNode?.next?.next
            //1->3
            fir?.next = sec?.next
            //2->1
            sec?.next = fir
            //temp->next -> sec
            tempNode?.next = sec
            
            //update tempNode pointer
            tempNode = fir
        }
        
        return dummyNode.next
    }

OC

c 复制代码
- (ListNodeOC * _Nullable)swapPairs:(ListNodeOC * _Nullable)head {
    //build dummy node
    ListNodeOC *dummyNode = [[ListNodeOC alloc] initWithVal:0];
    dummyNode.next = head;
    
    ListNodeOC *tempNode = dummyNode;
    while(tempNode.next && tempNode.next.next) {
        ListNodeOC *fir = tempNode.next;
        ListNodeOC *sec = tempNode.next.next;
        
        tempNode.next = sec;
        fir.next = sec.next;
        sec.next = fir;
        
        tempNoe = fir;
    }
    
    return dummyNode.next;
}
相关推荐
小弥儿2 小时前
开源 VoiceStudio,声音克隆|配音|有声书一站式本地完成
学习·开源·github
点心的游戏开发世界5 小时前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#
香芋芋圆6 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
INS_KF7 小时前
【编程笔记】成员函数中两个 const 的区别(const Data &getData() const;)
前端·javascript·笔记
点心的游戏开发世界7 小时前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
Tisfy8 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
tju新生代魔迷8 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
点心的游戏开发世界9 小时前
UnityShaderGraph滚动UV笔记
笔记·uv
瑞码空间9 小时前
git知识点黄金笔记
笔记·git·elasticsearch
木井巳10 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法