用一组任意存储的单元来存储线性表的数据元素。一个对象存储着本身的值和下一个元素的地址。
- 需要遍历才能查询到元素,查询慢。
- 插入元素只需断开连接重新赋值,插入快。
Eg. 链表在开发中也是经常用到的数据结构,React16的 Fiber Node连接起来形成的Fiber Tree, 就是个单链表结构。
经典问题:
从尾到头打印链表
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
//要了解链表的数据结构:
//val属性存储当前的值,next属性存储下一个节点的引用。
//要遍历链表就是不断找到当前节点的next节点,当next节点是null时,说明是最后一个节点,停止遍历。
//因为是从尾到头的顺序,使用一个队列来存储打印结果,每次从队列头部插入。
function printListFromTailToHead(head)
{
const array = [];
while(head){
array.unshift(head.val);
head = head.next;
}
return array;
}
反转链表
输入一个链表,反转链表后,输出新链表的表头。
// 以链表的头部节点为基准节点
// 将基准节点的下一个节点挪到头部作为头节点
// 当基准节点的next为null,则其已经成为最后一个节点,
// 链表已经反转完成
var reverseList = function (head) {
let currentNode = null;
let headNode = head;
while (head && head.next) {
currentNode = head.next;
head.next = currentNode.next;
currentNode.next = headNode;
headNode = currentNode;
}
return headNode;
};
// 递归反转链表
var reverseList = function(head) {
if (head == null || head.next == null) {
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
};