数据结构-单链表

175 阅读1分钟
const createList = value => {
  return createNode(value);
};
const appendList = (list, value) => {
  const node = createNode(value);
  let x = list;
  while (x.next) {//如果x有下一个节点,链上下一个节点,没有的话什么都不做
    x = x.next;
  }
  // x.next === null //x 是最后一个节点
  x.next = node;//设node是x的下一个节点
  return node;
};
const removeFromList = (list, node) => {
  let x = list;
  let p = node; // 将 p 初始化改为 node
  while (x !== node && x !== null) { // 如果 node 不在 list 中,x 就可能为 null
    p = x;
    x = x.next;
    //说明node不是要删的节点,找下一个
  }
  if(x === null){ // 若 x 为 null,则不需要删除,直接 returnfalse 表示无法删除不在list里的节点
    return false
  }else if(x === p){ // 这说明要删除的节点是第一个节点
    p = x.next
    return p // 如果删除的是第一个节点,那么就要把新 list 的头节点 p 返回给外面,即 newList = removeFromList(list, list)
  }else{
    p.next = x.next;//删除执行
    return list // 如果删除的不是第一个节点,返回原来的 list 即可
  }
};

const createNode = value => {
  return {
    data: value,
    next: null
  };
};

const travelList = (list, fn) => {
  let x = list;
  while (x !== null) {
    fn(x);
    x = x.next;
  }
};

const list = createList(10);//增
const node2 = appendList(list, 20);
const node3 = appendList(list, 30);
const node4 = appendList(list, 40);
const removeFromList = (list, node3)//删
travelList(list, node => {
  console.log(node.data);
});