Aha! Algorithms

Aha! Algorithms - Linked List Si

2017-03-17  本文已影响0人  su3

《啊哈!算法》第 2 章第 5 节,模拟链表的 Swift 实现。

问题

为数组添加一个数,仍然得到按数值大小的排序,但不移动原数组的位置。

解决

用 data 存数组,用 right 记录对应 data 中的数值的下一个数所在的编号(0 编号表示结束)。为 data 尾部添加一个数后,修改 3 处 right 编号(1 新添加的数 2 此前的数 3 结束的数),完成插入。

var data = [0] //初始化链表,前置一个空项,不打印此项
var right: [Int] = []

//待操作的数组
data += [2, 3, 5, 8, 9, 10, 18, 26, 32]

//初始化数组的 right
var count = data.count
for i in 0...count  {
    if i != count {
        right.append(i+1)
    }else{
        right.append(0)
    }
}

//直接在数组 data 末尾添加一个数
data.append(6)
count += 1

//从链表头部开始遍历
var t = 1
while t != 0 {
    //如果当前节点的下一个节点大于插入数,将数插到中间
    if data[right[t]] > data[count-1] {
        //新插入数的下一个节点编号等于当前节点的下一个节点编号
        right[count-1] = right[t]
        //当前节点的下一个节点编号等于新插入数的编号(最后一个)
        right[t] = count - 1
        //原数组最后一个节点的下一个节点编号为0(标记着数组结束)书中的 bug,缺了结束编号
        right[count-1-1] = 0
        break //完成插入,退出循环
    }
    t = right[t]
}

//遍历输出链表中的所有数
t = 1
while t != 0 {
    print("\(data[t])")
    t = right[t]
}

代码在 GitHub

上一篇下一篇

猜你喜欢

热点阅读