class Node {
constructor(public element = element, public next = null) {}
}
class LinkedList {
constructor() {
this.length = 0;
this.head = null;
}
public append(element: any) {}
public insert(position: number, element: Node) {}
public removeAt(position: number){}
public remove(element: Node){}
public indexOf(element: Node){}
public isEmpty(): boolean{}
public size(): number{}
public getHead(): Node{}
public toString(): string {}
public print() {}
}
public toString() {
let current = this.head;
let string = '';
while(current) {
string += current.element + (current.next ? 'n' : '');
current = current.next;
}
return string;
}
indexOf
indexOf方法接受一个元素的值,如果在列表中找到它,就返回元素的位置,否则返回-1
public indexOf(element: any) {
let current = this.head;
let index = -1;
while(current) {
if (element === current.element) {
return index;
}
index += 1;
current = current.next;
}
return -1;
}
链表
单项链表
单项链表的基本结构
向链表尾部追加元素
向链表对象尾部添加一个元素时,可能有两种场景: 列表空时,添加的是第一个元素,列表不为空时,向其追加元素
从链表中移除元素
移除元素也分两种场景: 移除第一个元素或移除第一个以外的任一元素
移除列表最后一项或中间某一项时, 需要依靠一个细节来迭代列表,直到到达目标位置,使用一个内部递增的
index
变量,current
变量为所循环列表的当前元素进行引用,以及一个对当前元素的前一个元素引用的变量
previous
从列表中删除当前元素,要做的就是将previous.next和current.next连接起来
在任意位置插入一个元素
insert
方法用于在任意位置插入一个元素当插入位置为0时,先把新插入node的next设为当前head,再把head修改为node,就成功把新元素插入到了列表头部
当插入位置在中间或尾部时,循环遍历列表,找到目标位置,在previous和current中间添加新元素,将新元素的next设为current,previous的next设为新元素,这样就成功在列表中间插入了新元素
其他方法
toString
toString方法需要将LinkedList对象转换成一个字符串
indexOf
indexOf方法接受一个元素的值,如果在列表中找到它,就返回元素的位置,否则返回-1
remove
remove方法可以依赖indexOf方法先找到要移除元素的index,然后调用
this.removeAt
将index传进去从而删除元素isEmpty && size && getHead
双向链表
双向链表与单项链表的区别是,双向链表有两个分别指向上一个元素以及下一个元素的链接
因此,双向链表除了
head
属性外,还有一个表示尾部元素的tail
属性双向链表还提供了两种迭代列表的方法: 从头到尾以及从尾到头.我们也可以访问一个特定节点的下一个或上一个元素
任意位置插入新元素
双向链表插入操作和单项链表相似,唯一的区别是单项链表只需要维护一个next指针,而双向链表需要同时维护next和prev指针
从任意位置移除元素
同样需要处理三种场景
循环链表
循环链表可以像链表一样只有单向引用,也可以像双向链表一样有双向引用,循环链表和链表之间唯一的区别是,最后一个元素的next指针并不指向null,而是头部元素