目录
第五章 数据结构之“链表”
5.1 链表简介
- 利用abojct创建一个链表
const a = {val: ‘a’};
const b = {val: ‘b’};
const c = {val: ‘c’};
const d = {val: ‘d’};- 用指针把a, b, c, d关联起来
a.next = b;
b.next = c;
c.next = d;- 遍历链表
let p = a; // 声明一个指针p且指向a
while 循环,指针存在时,打印对应的值
while§ {//在p还有值的前提下不断地把p移动到下一个值
console.log(p.val);//访问链表里面每个元素的值
p = p.next; // 移动指针
}- 在链表中插入值,把e插入c和d之间
const e = {val: ‘e’};
c.next = e;//改变指针的指向
e.next = d;- 删除 :改变c的指针,e被删除
c.next = d;
5.2 LeetCode:237,删除链表中的节点
node.val = node.next.val;//把下一个节点的值赋值给该节点
node.next = node.next.next;//该节点的指针指向下下一个节点
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} node
* @return {void} Do not return anything, modify node in-place instead.
*/
var deleteNode = function (node) {
node.val = node.next.val;//把当前节点的值设置成下个节点的值
node.next = node.next.next;//删除下个节点:直接把next的指针指向下下个节点
};
5.3 LeetCode:206,反转链表
解题思路:
- 从简单开始,找到规律多次重复
- 翻转1个 n+1 指向n. 后边的指向前面
- 使用两个指针遍历,对两个指针指向进行翻转,然后两个指针都迭代到下两个,进行同样的操作
解题步骤:
- 声明两个指针
- 确定指向位置
- 让两个指针迭代起来,遍历整个链表
- 像不像排序里,交换两个变量。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function (head) {
let p1 = head;//p1指向1
let p2 = null;//p2指向null
//遍历链表
while (p1) {
const tmp = p1.next; //新建一个变量用来存储,p1.next的值
console.log(p1.val, p2 && p2.val); //p2有可能会为空,所以要保证p2不为空的前提下取到p2.val
p1.next =