gpt4 book ai didi

swift - 无法将整个双向链表元素打印到控制台

转载 作者:行者123 更新时间:2023-11-28 13:33:21 25 4
gpt4 key购买 nike

我已经在 Swift 中实现了一个双向链表。一切顺利。链接设置得很好,我可以使用 nextNode 和 previousNode 属性访问每个元素。但是当我将列表打印到控制台时,它只打印出列表的头部。

import Foundation

struct DoublyLinkedList<DataItem> {
fileprivate var head : Node<DataItem>?
fileprivate var tail : Node<DataItem>?

var isEmpty : Bool {
return head == nil
}

//to add at the beginning
mutating func InsertAtBeginning(_ dataItem : DataItem) {
let node = Node(dataItem: dataItem, nextNode: head, previousNode: nil)
head?.previousNode = node
head = node
if tail == nil {
tail = head
}
}

//to add at the end
mutating func insertAtEnd(_ dataItem : DataItem) {
guard !isEmpty else {
InsertAtBeginning(dataItem)
return
}

let newNode = Node(dataItem: dataItem, nextNode: nil, previousNode: tail)
tail?.nextNode = newNode
//newNode.previousNode = tail
tail = newNode

}
}

extension DoublyLinkedList : CustomStringConvertible {
var description : String {
guard let doublyLinkedListHead = head else { return "UnderFlow"}
return String(describing: doublyLinkedListHead)
}
}

class Node<DataItem> {
var dataItem : DataItem
var nextNode : Node?
var previousNode : Node?

init(dataItem : DataItem , nextNode : Node? = nil , previousNode : Node? = nil) {
self.dataItem = dataItem
self.nextNode = nextNode
self.previousNode = previousNode
}
}

extension Node : CustomStringConvertible {
var description: String {
return "\(dataItem) "
}
}

var list = DoublyLinkedList<Int>()
list.InsertAtBeginning(4)
list.InsertAtBeginning(7)
print(list)
list.insertAtEnd(5)
list.insertAtEnd(4)
print(list)
let node1 = list.head?.nextNode
node1?.previousNode
list.tail?.previousNode?.previousNode

当我打印 node它应该打印 node和一个nextNode和一个previousNodenode当我打印 list ,它应该打印整个列表。例如,当我访问 head它应该返回 nil <-> 7 <-> 4 .当我打印 list , 它应该给出所有的元素。

最佳答案

这是满足您要求的实现。

description对于 Node现在返回 previousNode!.dataItem <-> dataItem <-> nextNode!dataItem .如果previousNodenextNodenil , 然后 nil将被打印出来。

description对于 DoublyLinkedList将使用 linkedDescriptionNode提供列表的递归描述。每个NodelinkedDescription将包括 Node s dataItem加上 linkedDescriptionnextNode如果不是 nil . <->用在节点之间来表示链接。

extension DoublyLinkedList : CustomStringConvertible {
var description : String {
guard let doublyLinkedListHead = head else { return "UnderFlow"}
return doublyLinkedListHead.linkedDescription
}
}

extension Node : CustomStringConvertible {
var description: String { return
((previousNode == nil) ? "nil" : "\(previousNode!.dataItem)") +
" <-> \(dataItem) <-> " +
((nextNode == nil) ? "nil" : "\(nextNode!.dataItem)")
}

var linkedDescription: String {
return "\(dataItem)" + ((nextNode == nil) ? "" : " <-> \(nextNode!.linkedDescription)")
}
}

当您 print(list) 时,这将递归地提供整个列表.当你print(node) , 它将提供 previousNode!.dataItem <-> dataItem <-> nextNode!.dataItem .


示例:

var list = DoublyLinkedList<Int>()
list.InsertAtBeginning(4)
list.InsertAtBeginning(7)
print(list)
7 <-> 4
print(list.head!)
nil <-> 7 <-> 4
list.insertAtEnd(5)
list.insertAtEnd(4)
print(list)
7 <-> 4 <-> 5 <-> 4
print(list.head!.nextNode!)
7 <-> 4 <-> 5

关于swift - 无法将整个双向链表元素打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57028070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com