javascript中在链表中向前(向后)移动n个节点

/**
 * 实现在链表中向前移动n个节点和向后移动n个节点
 *
 * */

//链表节点
function Node(element){
    this.element = element;
    this.next = null;
    this.previous = null;
}

//链表
function LList(){
    this.head = new Node(‘head‘);
    this.find = find;
    this.insert = insert;
    this.display = display;
    this.remove = remove;
    this.findLast = findLast;
    this.dispReverse = dispReverse;
    //当前节点就是头节点
    this.currentNode = this.head;
    //从链表开头向前移动n个节点
    this.advance = advance;
    //从链表某个节点向后回退n个节点
    this.back = back;
    //显示当前节点
    this.show = show;
}

//倒序输出链表中的所有节点
function dispReverse(){
    var currNode = this.head;
    currNode = this.findLast();
    while (!(currNode.previous == null)){
        document.write(currNode.element + ‘ ‘);
        currNode = currNode.previous;
    }
}

//找到最后一个节点
function findLast(){
    var currNode = this.head;
    while (!(currNode.next == null)){
        currNode = currNode.next;
    }
    return currNode;
}

//删除某一个节点
function remove(item){
    var currNode = this.find(item);
    if(!(currNode.next == null)){
        currNode.previous.next = currNode.next;
        currNode.next.previous = currNode.previous;
        currNode.next = null;
        currNode.previous = null;
    }
}

//打印所有链表节点
function display(){
    var currNode = this.head;
    while (!(currNode.next == null)){
        document.write(currNode.next.element + ‘ ‘);
        currNode = currNode.next;
    }
}

//找到某一个节点
function find(item){
    var currNode = this.head;
    while (currNode.element != item){
        currNode = currNode.next;
    }
    return currNode;
}

//插入某一个节点
function insert(newElement , item){
    var newNode = new Node(newElement);
    var current = this.find(item);
    newNode.next = current.next;
    newNode.previous = current;
    current.next = newNode;
}

//在链表中向前移动n个节点
function advance(n){
    while ((n>0) && !(this.currentNode.next==null)){
        this.currentNode = this.currentNode.next;
        n--
    }
}

//在链表中向后移动n个节点
function back(n){
    while (n>0 && !(this.currentNode.element==‘head‘)){
        this.currentNode = this.currentNode.previous;
        n--;
    }
}

//显示当前节点
function show(){
    document.write(this.currentNode.element);
}

var cities = new LList();
cities.insert(‘Conway‘,‘head‘);
cities.insert(‘Russellville‘, ‘Conway‘);
cities.insert(‘Carlisle‘, ‘Russellville‘);
cities.insert(‘Alma‘ , ‘Carlisle‘);
cities.insert(‘dezhou‘ , ‘Alma‘);
cities.insert(‘alasijia‘ , ‘dezhou‘);
cities.display();
document.write(‘<br>‘);

cities.show();
cities.advance(4);
document.write(‘<br>‘);
cities.show();
cities.back(2);
document.write(‘<br>‘);
cities.show();
时间: 2024-10-09 22:03:06

javascript中在链表中向前(向后)移动n个节点的相关文章

关于链表中哨兵结点问题的深入剖析

最近正在学习UC Berkeley的CS61B这门课,主要是采用Java语言去实现一些数据结构以及运用数据结构去做一些project.这门课不仅告诉你这个东西怎么做,而且一步一步探寻为什么要这样做以及为什么会有这些功能.我们有时在接触某段代码或功能的实现时,可能直接就看到了它最终的面貌,而不知道如何一步步演化而来,其实每一个功能的添加或优化都是对应一个问题的解决.下面就这门课中关于链表中哨兵结点的相关问题进行总结. 什么是哨兵结点 哨兵顾名思义有巡逻.检查的功能,在我们程序中通过增加哨兵结点往往

javascript中的链表结构

1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript中和php中数组的长度是可以任意增加的.在数组中添加和删除元素也是比较麻烦,因为要将数组中其他元素向前或者向后平移,这个在javascript中也不是问题,javascript中有一个很方便的方法splice()方法很方便的就可以添加或删除元素. 但是凡是都是相对的,javascript中的数组也有

javascript中的链表结构—双向链表

1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向链表的结构.尽管从链表中头节点遍历到尾节点很容易,但是反过来,从后向前遍历就没有那么简单.通过给Node对象增加一个属性,该属性存储指向前驱节点的链接,这样就容易多了.此时祥链表中插入一个节点需要更多的工作,我们需要指出该节点正确的前驱和猴急.但是在从链表中删除节点的时候效率更高了,不需要再查找待删

javascript中的链表结构—从链表中删除元素

1.概念 上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remove()方法. 从链表中删除节点的时候,需要先找到这个待删除节点的前面的节点.找到这个节点之后修改它的next属性,使其指向待删除节点的下一个节点,这样就把待删除节点给删除了,是不是很简单呢?但是问题来了,我们是不是要找到待删除节点的前面一个节点呢?这样就需要添加一个findPrevious()方法来

剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1-&gt;2-&gt;3-&gt;3-&gt;4-&gt;4-&gt;5 处理后为 1-&gt;2-&gt;5

1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 2 思路和方法 (1)链表为空,不必多说,return NULL: (2)如果恰恰是头结点与头结点的后一个重复了,这种情况是可以发生的,那头结点就要被删除,另选新的结点作为头结点.如何处理这种特殊情况,多申请一个指针就可以了. 3 C++核心代码 1 /* 2 struct

Javascript中的链表

function LinkedList() { // 辅助类,表示加入链表的每一项 var Node=function(element){ this.element=element; this.next=null; } // 列表,存储链表的长度 var length=0; var head=null; this.append=function(element){ var node=new Node(element),current; if(head===null){ head=node; }e

lintcode 容易题:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 解题: 要删除倒数第n个节点,我们要找到其前面一个节点,也就是倒数第n+1的节点,找到这个节点就可以进行删除.和上题的思想很类似, 定义两个指针,p和cur,cur指针向前走,走了n

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点. 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步.可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通. 既然不能从尾节点开始遍历这个链表,我们还是把思路回到头

输出链表中倒数第k个结点

题目:输入一个单向链表,输出该链表中倒数第k个结点.最后一个结点为倒数第一个结点. 思路: 1.首先遍历链表的长度获得链表的length,则它的倒数第k个结点就是正数length-k+1个结点,但这需要遍历链表两次 2.使用两个指针可以实现遍历一次,first指针指向头结点,second指针指向first之后的k-1个结点,然后两个结点循环向后移动,直到second结点到达链表的最后一个结点时,first结点指向倒数第k个结点. 注意: 1.要判断传来的参数 *head和k是否合法 2.判断k是