本文介绍: 假设我们正在开发一款小游戏,在游戏存在这样一种场景,当队伍排名最后一名玩家在捡到某种道具后,可以使用该道具对他所在的队伍进行一个反转比如1-2-3-4-5分别是五名玩家反转后变成5-4-3-2-1,请问如何链表场景下进行反转?的解决办法递归算法核心逻辑在于先递归遍历最后一个链表节点然后以相反的方向将前一个元素赋值给后一个元素next递归结束刚好完成从后向前的递归反转,具体代码如下。关于这个问题有多种解法我们这里介绍两种解法。首先我们准备基本的链表代码如下

假设我们正在开发一款小游戏,在游戏存在这样一种场景,当队伍排名最后一名玩家在捡到某种道具后,可以使用该道具对他所在的队伍进行一个反转,比如1-2-3-4-5分别是五名玩家,反转后变成5-4-3-2-1,请问如何在链表的场景下进行反转?

关于这个问题有多种解法,我们在这里介绍两种解法。一是递归解法,二是出栈解法

首先我们准备基本的链表代码如下

//设计一个简单的链表节点类型
class LinkedListNode {
    var content: String
    var next: LinkedListNode?
    
    init(content: String, next: LinkedListNode? = nil) {
        self.content = content
        self.next = next
    }
}

//创建链表并完成初始化
func getLinkedList() -> LinkedListNode {
    var p4 = LinkedListNode(content: "I am p4", next: nil)
    var p3 = LinkedListNode(content: "I am p3", next: p4)
    var p2 = LinkedListNode(content: "I am p2", next: p3)
    var p1 = LinkedListNode(content: "I am p1", next: p2)
    var head = LinkedListNode(content: "I am head", next: p1)
    
    return head
}

准备一个链表输出方法

//输出链表
func printLinkedList(linkedList: LinkedListNode) {
    var p: LinkedListNode? = linkedList
    
    while true {
        guard p == nil else {
            print(p!.content)
            continue
        }
        break
    }
}

现在我们开始进行递归算法解决办法递归算法核心逻辑在于先递归遍历最后一个链表节点然后以相反的方向将前一个元素赋值给后一个元素的next,递归结束刚好完成从后向前的递归反转,具体代码如下

//递归版
func reverseLinkedList(linkedList: LinkedListNode) -> LinkedListNode {
    //确定是否是链表的最后一个节点
    if linkedList.next == nil {
        return linkedList
    }
    
    //获取最后一个节点tail
    let tail = reverseLinkedList(linkedList: linkedList.next!)
    //在每一次递归中对next进行反转
    linkedList.next?.next = linkedList
    linkedList.next = nil
    //返回tail指针,现在它是反转后的head节点return tail
}

当然我们也可以采取另一种方式来反转链表,该方法非常简单,甚至可以在此基础上做更多的改造,这个方法核心逻辑就是用一个容器来辅助反转。

//进出栈版
func reverseLinkedList(linkedList: LinkedListNode) -> LinkedListNode {
    var p: LinkedListNode? = linkedList
        
    //建立一个数var nodeArray: Array<LinkedListNode&gt; = []
    
    while true {
        guard p == nil else {
            nodeArray.insert(p!, at: 0)
            p = p!.next
            continue
        }
        break
    }
    
    for i in nodeArray.indices {
        if i == nodeArray.count - 1 {
            nodeArray[i].next = nil
        } else {
            nodeArray[i].next = nodeArray[i + 1]
        }
    }
    
    return nodeArray[0]
}

当然还存在另一种方法,就是用三指针分别交换方法,这个比较绕但是也是一种效率比较高的方法,就不在此赘述,有需要可以自行了解。

原文地址:https://blog.csdn.net/sinat_25960599/article/details/130885364

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_24382.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注