力扣题目学习笔记(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;
}
相关推荐
知识分享小能手3 小时前
Redis入门学习教程,从入门到精通,Redis 概述:知识点详解(1)
数据库·redis·学习
张李浩4 小时前
Leetcode 054螺旋矩阵 采用方向数组解决
算法·leetcode·矩阵
big_rabbit05025 小时前
[算法][力扣101]对称二叉树
数据结构·算法·leetcode
red_redemption5 小时前
自由学习记录(135)
学习
金山几座6 小时前
C#学习记录-事件
开发语言·学习·c#
X在敲AI代码6 小时前
推荐系统学习 D1推荐系统核心概述
学习·推荐算法
我的xiaodoujiao6 小时前
API接口自动化测试详细图文教程学习系列1--序章
python·学习·pytest
圆弧YH6 小时前
服务器及网站操作
学习
Alphapeople6 小时前
具身智能学习路线
学习
肖恭伟7 小时前
VScode入门学习
ide·vscode·学习