力扣题目学习笔记(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;
}
相关推荐
南加第一划水23 分钟前
Leetcode 每日一题:Evaluate Division
算法·leetcode·职场和发展
微刻时光24 分钟前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
chnyi6_ya1 小时前
一些写leetcode的笔记
笔记·leetcode·c#
zero_one_Machel1 小时前
leetcode73矩阵置零
算法·leetcode·矩阵
青椒大仙KI112 小时前
24/9/19 算法笔记 kaggle BankChurn数据分类
笔记·算法·分类
立志成为coding大牛的菜鸟.2 小时前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞2 小时前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
liangbm32 小时前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
潮汐退涨月冷风霜2 小时前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习
GoppViper3 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理