一、链表是什么?与数组有什么区别?生活中有什么例子?
1)链式存储的线性表,相连属性通过指针链接,将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。
2)
数组:使用一块连续的内存空间存储,每个元素有指定的索引值,增删的时候,要移动目标位置之后的所有元素。
链表:查询元素慢,没有索引值,必须遍历整个链表,增删的时候,只要改变相连元素之间的指针就可以了
3)有点像上体育课的时候排队,排在每个人左边和右边的人有个对应的关系,并且询问每个人就能知道左边和右边是谁。
二、请实现一个链表,并实现以下方法:
- append(element):向链表尾部添加一个新的元素。
- insert(position, element):向链表指定位置插入一个新的元素。
- remove(element):从链表中移除并返回已删除的元素(若有多个相同元素则取第一次出现的情况)。
- getNode(position):获取指定索引位置的节点。
- indexOf(element):返回元素在链表中的索引(若有多个相同元素则取第一次出现的情况),如果列表中没有该元素则返回 -1。
- removeAt(position):从链表特定的位置移除一项。
- getHead():获取链表头部。
- getTail():获取链表尾部。
- isEmpty():如果链表中不包含任何元素,返回 true,否则返回 false。
- size():返回链表中元素个数,与数组的 length 属性类似。
- print():打印链表中的所有元素,如 “0@1–>1@2–>2@3–>3@4–>4@5”(”index@element”)。
1 | function Node(element) { |
三、基于链表分别实现 Stack 和 Queue
栈
1 | class Stack { |
队列
1 | class Queue { |
四、链表反转
请实现一个 reverseLinkedList() 方法,用于实现链表反转。
1 | function reverseLinkedList(head) { |
五、请实现一个双向链表 DoublyLinkedList
- insert(position, element):向链表指定位置插入一个新的元素。
- removeAt(position):从链表特定的位置移除一项。
1 | function Node(element) { |