力扣题目学习笔记(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;
}
相关推荐
副露のmagic3 分钟前
更弱智的算法学习 day48
学习·算法
Nan_Shu_6144 分钟前
学习: Threejs (15)& Threejs (16)
学习·three.js
知识分享小能手10 分钟前
Oracle 19c入门学习教程,从入门到精通,Oracle 过程、函数、触发器和包详解(7)
数据库·学习·oracle
程序员-King.17 分钟前
day154—回溯—分割回文串(LeetCode-131)
算法·leetcode·深度优先·回溯
程序员-King.17 分钟前
day155—回溯—组合(LeetCode-77)
算法·leetcode·回溯
漏刻有时28 分钟前
微信小程序学习实录14:微信小程序手写签名功能完整开发方案
学习·微信小程序·notepad++
程序员-King.30 分钟前
day152—回溯—电话号码的字母组合(LeetCode-17)
算法·leetcode·深度优先·递归
魔芋红茶41 分钟前
Spring Security 学习笔记 1:快速开始
笔记·学习·spring
皮蛋sol周42 分钟前
嵌入式学习数据结构(三)栈 链式 循环队列
arm开发·数据结构·学习·算法··循环队列·链式队列
皇夜_1 小时前
【AI发电】极简笔记:支持安卓和H5协同笔记
笔记