链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1);
数组与链表的优缺点;
数组:
优点:使用方便 ,查询效率 比链表高,内存为一连续的区域
缺点:大小固定,不适合动态存储,不方便动态添加
链表:
优点:可动态添加删除 大小可变
缺点:只能通过顺次指针访问,查询效率低
以下是用swift写一个简单的单向链表,添加、插入和展示的方法!
class PersonList {
var data: Int
var next: PersonList?
init(data: Int) {
self.data = data
}
/// 插入一个对象
func insert(person: PersonList) {
person.next = next
next = person
}
/// 拼接新的对象
func appendNew(person: PersonList) {
var myList = self
/// 查询最后一个元素,然后给最后一个元素赋值
while myList.next != nil {
myList = myList.next!
}
myList.next = person
}
/// 显示整个链表
func show() {
var myList = self
while myList.next != nil {
print(myList.data)
myList = myList.next!
if myList.next == nil {
print(myList.data)
}
}
}
/// 展示第n个元素
func show(index: Int) {
var max = index
var myList = self
while max-1 != 0 {
myList = myList.next!
max = max - 1
}
print(myList.data)
}
/// 展示倒数第n个元素
func show(unindex: Int) {
var p1 = self
var p2 = self
for _ in 0..<unindex-1 {
p2 = p2.next!
}
while p2.next != nil {
p1 = p1.next!
p2 = p2.next!
}
print(p1.data)
}
/// 反转单链表
func tempRevert() {
var head: PersonList = self
var newHead: PersonList?
var node: PersonList?
while head.next != nil {
node = head
head = head.next!
node?.next = newHead
newHead = node
if head.next == nil {
print(head.data)
}
}
newHead?.show()
}
}
var person = PersonList(data: 10)
person.appendNew(person: PersonList(data: 30));
person.appendNew(person: PersonList(data: 40));
person.appendNew(person: PersonList(data: 50));
person.insert(person: PersonList(data: 20))
person.show()
/// 最后输出是 10 20 30 40 50
如果转载请注明转于:AirZilong的博客