单向链表
- 新增 append(elem) 链表尾部添加新项
- 插入 insert(elem,position) 在特定的位置插入元素
- 移除 removeAt 重列表中特定的位置移除
- isEmpty 判断链表是否为空
- indexOf(elem) 返回元素在列表中的位置
- size 返回链表长度
- toString 返回所有链表元素的拼接字符串
function LinkedList(){ // 链表实现 var length = 0; // 链表元素个数 var head = null; // 链表开头元素 // 链表单元类 function Node(elem){ this.elem = elem; this.next = null; } /** * @function append 添加元素 * @argument {elem} * @returns */ this.append = function(elem){ var node = new Node(elem); var current; // 链表的当前一个 // 如果链表中没有其他元素 if(!head){ head = node; }else{ // 遍历链表 添加到最后一个 current = head; while(current.next){ // 重第一个开始遍历找到最后一个再添加上 current = current.next; } current.next = node; } // 更新链表长度 length =length+1; } /** * @function moveAt * @argument {position} number * @returns {any} */ this.moveAt = function(position){ // 边界判断 if(position>-1&&position<length){ var current; // 当前元素 var pre; // 前一个元素 var index = 0; // 迭代指针 // 如果是第一个 if(position === 0){ head = head.next; }else{ current = head; while(index < position){ pre = current; current = current.next; index ++; } // 将前一个元素和后一个元素连接起来 pre.next = current.next; } length --; return current.elem; }else{ return null; } } /** * @function insert * @argument {elem,position} * @returns {boolean} */ this.insert = function(elem,position){ var node = new Node(elem); var index = 0; // 迭代指针 var current = head; // 当前元素 var pre; // 前一个元素 // 边界判断 if(position>-1&&position<length){ // 当插入的位置是0 if(position === 0){ node.next = current; }else{ while(index<position){ pre = current; current = current.next; index ++; } node.next = current; pre.next = node; }; // 更新长度 length ++; return true; }else{ return false; } } /** * @function toString * @returns {string} */ this.toString = function(){ var current = head; var str = ''; while(current){ str += `${current.elem} `; current = current.next; } return str; } /** * @function indexOf * @argument {elem} * @returns {number} */ this.indexOf = function(elem){ var index = 0; // 迭代指针 var current = head; while(current){ if(current.elem === elem){ return index; } index ++; current = current.next; } return -1; } /** * @function isEmpty * @returns {boolean} */ this.isEmpty = function(){ return length === 0; } /** * @function size * @returns {number} */ this.size = function(){ return length; } /** * @function getHead * @returns {object} */ this.getHead = function(){ return head; }}var linklist = new LinkedList();linklist.append(1);linklist.append(2);linklist.append(3);linklist.append(4);// console.log(linklist.getHead())linklist.insert(31,2);console.log(linklist.toString())console.log(linklist.size())console.log(linklist.isEmpty())console.log(linklist.moveAt(2))