前端算法学习js链表定义及翻转

1.定义节点类

function Node(element) {
  this.element = element;
  this.next = null;
}

2.定义链表及增删查改方法

function linkList() {
  this.head = new Node('head');
  //调用对链表增删删改的方法
  this.find = find;
  this.insert = insert;
  this.display = display;
  this.findByIndex = findByIndex;
  this.reserveList = reserveList;
}
function find(item) {
  var curNode = this.head;
  while (curNode.element != item) {
    curNode = curNode.next;
  }
  return curNode;
}
//通过索引找元素
function findByIndex(index) {
  var curNode = this.head;
  let i = 0;
  while (i != index) {
    i++;
    curNode = curNode.next;
  }
  return curNode;
}
function insert(newElement, item) {
  var newNode = new Node(newElement);
  var current = this.find(item);
  newNode.next = current.next;
  current.next = newNode;
}
//打印链表的方法
function display() {
  var currNode = this.head;
  while (!(currNode.next == null)) {
    currNode = currNode.next;
    console.log(currNode);
  }
}

另外写了一个输入数组转为链表存储的方法
//传进数组存在链表

function toList(array) {
  var list = new linkList();
  // console.log(list);
  list.insert(array[0], 'head');
  for (let i = 1; i < array.length; i++) {
    list.insert(array[i], array[i - 1]);
  }
  // list.display();
  return list;
}

3.算法:链表反转的方法
关于书写链表的一些方法时,容易出错的难点在于循环时next指针指向经常容易弄错,有时候已经改变了next指针的指向,对于指向问题最好多画图。

//关于链表翻转的方法,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3
function reserveList(k) {
  let midItem = this.findByIndex(k);
  let midItem2 = this.findByIndex(k + 1);

  //中间这部分代码实现了整个链表的翻转
  let prevNode = this.head.next;
  let currentNode = prevNode.next;
  let item;
  while (currentNode != null) {
    item = currentNode.next;
    currentNode.next = prevNode;
    prevNode = currentNode;
    currentNode = item;
  }
  item = this.head.next;
  this.head.next = prevNode;
  item.next = null;

  let newMid = item;
  //因为不是整个链表翻转,前后两部分分别翻转,所以在做一些调整
  let newMid2 = this.head.next;
  this.head.next = midItem;
  newMid.next = newMid2;
  midItem2.next = null;
  this.display();
}


var x = toList([1, 2, 3, 4, 5, 6, 7, 8]);
var y = x.findByIndex(3);
var z = x.reserveList(4);
测试例子

前端算法学习js链表定义及翻转_第1张图片

你可能感兴趣的:(js写算法)