1.概念

  在链表上移动n个节点,我第一眼看到这个需求的时候首先想到的是当前节点。使用这个当前节点作为参考来移动,没有这个当前节点的话是没有办法在链表上前进和后退的。初始化定义链表的时候定义一个当前节点,并且给这个当前节点赋值为头节点。向前移动的时候只需要使这个当前节点指向它下一个节点:this.currentNode = this.currentNode.next; 向后移动节点只需要使当前节点指向它前一个节点:this.currentNode = this.currentNode.next; 有了这个思路就好办了,剩下的只不过要使用循环控制移动n个节点就好了,当然向后移动的时候要判断是否到达链表末尾,向前移动的时候要判断是否到达链表头,如果是就停下来,这就说明这个需求有问题了。

  还有显示当前节点的值,这个就非常容易了,只需要把这个节点的element打印出来就好了。

2.代码实现

/*** 实现在链表中向前移动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();

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

  1. Java中Date类型如何向前向后滚动时间,( 附工具类)

    Java中的Date类型向前向后滚动时间(附工具类) 废话不多说,先看工具类: 1 import java.text.SimpleDateFormat; 2 import java.util.Cale ...

  2. 带哨兵节点的链_关于链表中哨兵结点问题的深入剖析

    算法 数据结构 关于链表中哨兵结点问题的深入剖析 最近正在学习UC Berkeley的CS61B这门课,主要是采用Java语言去实现一些数据结构以及运用数据结构去做一些project.这门课不仅告诉你 ...

  3. RT-Thread中的链表结构

    文章目录 RT-Thread中的链表组织结构 RT-Thread中的链表操作 链表节点的插入 链表节点的删除 链表节点元素访问 RT-Thread中的链表组织结构   RT-Thread中的链表是带表 ...

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

    1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...

  5. 数据结构例16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序。

    /* 16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序. */ # include <iostream> # include <stdlib.h> # i ...

  6. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  7. ajax 请求成功 再执行javascript,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...

    jquery中ajax请求后台数据成功后既不执行success也不执行error,此外系统报错:Uncaught SyntaxError: Unexpected identifier at Objec ...

  8. LeetCode(237)——删除链表中的节点(JavaScript)

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 – head = [4,5,1,9],它可以表示为: 示例1: 输入: head = [4,5 ...

  9. 【Java】牛客网 删除链表中重复的结点

    题目描述 : 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表 1->2->3->3->4->4->5 ...

最新文章

  1. 开发日记 20210316
  2. 数据结构与算法系列 目录
  3. 基于FPGA的图像增强系统的verilog开发(3000+字)
  4. Flash中的SLC/MLC/MLC--基础
  5. 那年我学过的SpringBoot笔记
  6. java并发学习--线程池(一)
  7. 远心镜头(Telecentric lens)原理介绍
  8. java输出 JButton,Java JButton用法
  9. dtu MySQL_DTU-DATACENTER
  10. 电脑系统win8计算机在哪里设置开机密码,电脑怎样设置开机密码_win8开机密码设置...
  11. 登陆器生成登陆器不显示服务器列表,GeeM2单机登录器读取不到列表怎么办?
  12. 清除购物车的php代码,ecshop 退出清空购物车
  13. 2020蓝桥杯省赛B组C++(第二场)真题
  14. 哈萨克斯坦大型“零元购”抓捕现场
  15. 微信小程序的页面美化
  16. 大数据---旅游业的新挑战
  17. STP(生成树协议)总结
  18. 简单实用的批量去除水印方法及操作步骤
  19. Android应用层View绘制流程与源码分析
  20. meta 标签的使用以及作用

热门文章

  1. seafile Windows MySQL_seafile4.3.1 + windows 2012 server +mysql 部署记录(3)
  2. 车牌识别算法_易泊车牌识别算法助力智慧城市交通
  3. weblogic进程自动关闭_手机内存不够还卡顿,那是你不会清理,关闭这3个设置就变流畅...
  4. 已知原函数和导函数的关系_根据函数表达式该如何求函数值
  5. Java中this关键字的详解
  6. html中遍历表单,萌新提问!!!如何用for循环循环表单?
  7. java epub 删除一页_java如何实现批量删除pdf指定的页数
  8. linux并发控制方法,linux系统并发控制
  9. java gc检测工具_Java自带的性能监测工具之jstat
  10. Emscripten 单词_免费下载 | 北师大版高中英语教材重点单词汇总(可下载mp3版本)...