javascript中的链表结构—从链表中删除元素
1.概念
上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remove()方法。
从链表中删除节点的时候,需要先找到这个待删除节点的前面的节点。找到这个节点之后修改它的next属性,使其指向待删除节点的下一个节点,这样就把待删除节点给删除了,是不是很简单呢?但是问题来了,我们是不是要找到待删除节点的前面一个节点呢?这样就需要添加一个findPrevious()方法来做这件事情。
findPrevious()方法遍历链表中的元素,检查每一个节点的下一个节点是否存储着待删除数据。如果找到,返回该节点(即前面的节点),这样就可以修改它的next属性了。findPrevious()方法定义如下:
function findPrevious(item){
    var currNode =     this.head;
    while ( (currNode.next != null) && (currNode.next.element != item) ){
        currNode = currNode.next;
    }
    return currNode;
}
有了这个findPrevious()方法之后就可以考虑如何写这个remove()方法了。代码如下:
function remove(item){
    var preNode = this.findPrevious(item);
    if(preNode.next != null){
        preNode.next = preNode.next.next;
    }
}
该方法中有一句preNode.next = preNode.next.next;这个使用了javascript中的对象属性,看起来有点奇怪,但是完全能说得通。
2.代码实现
下面的是完整的代码和测试代码:
function Node(element) {
    this.element = element;
    this.next = null;
}
function LList() {
    this.head = new Node('head');
    this.find = find;
    this.insert = insert;
    this.findPrevious = findPrevious;
    this.remove = remove;
    this.display = display;
}
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;
    current.next = newNode;
}
function findPrevious(item){
    var currNode =     this.head;
    while ( (currNode.next != null) && (currNode.next.element != item) ){
        currNode = currNode.next;
    }
    return currNode;
}
function remove(item){
    var preNode = this.findPrevious(item);
    if(preNode.next != null){
        preNode.next = preNode.next.next;
    }
}
function display() {
    var currNode = this.head;
    while(!(currNode.next == null)) {
        document.write(currNode.next.element + ' ');
        currNode = currNode.next;
    }
}
//测试程序
var cities = new LList();
cities.insert("Conway", "head");
cities.insert("Russellville", "Conway");
cities.insert("Carlise", "Russellville");
cities.insert("Alma", "Carlise");
cities.display();
document.write('<br>');
cities.remove('Carlise');
cities.display();
最后的输出结果如下:

javascript中的链表结构—从链表中删除元素的更多相关文章
- @清晰掉  C++ 中的 enum 结构在内存中是怎么存储的?
		
C++ 中的 enum 结构在内存中是怎么存储的? C++ C++ 中的 enum 结构在内存中是怎么存储的?里面存储的是常量值吗? 关于占用内存的大小,enum类型本身是不占内存的,编译器直接 ...
 - 《Java数据结构》链表结构(单向链表,双向链表)
		
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...
 - JavaScript(20)jQuery HTML 加入和删除元素
		
jQuery - 加入元素 通过 jQuery,能够非常easy地加入新元素/内容. 加入新的 HTML 内容的四个 jQuery 方法: append() - 在被选元素的结尾插入内容 prepen ...
 - javascript中的链表结构—双向链表
		
1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...
 - 数据结构( Pyhon 语言描述 ) — — 第4章:数据和链表结构
		
数据结构是表示一个集合中包含的数据的一个对象 数组数据结构 数组是一个数据结构 支持按照位置对某一项的随机访问,且这种访问的时间是常数 在创建数组时,给定了用于存储数据的位置的一个数目,并且数组的长度 ...
 - MFC中的NMHDR结构体和NMUPDOWN结构体
		
建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM ...
 - javascript中的链表结构
		
1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...
 - [pjsip]Pjlib中的链表结构
		
Pjlib的链表结构跟常见的链表结构有所区别,如下图所示: 图1:一般链表结构 图2:pjlib中的链表结构 可以看到一般的双向链表是链表节点包含数据域,而pjlib中是数据域包含链表节点.一般的链表 ...
 - JavaScript实现单向链表结构
		
参考资料 一.什么是链表结构? 1.1.简介 链表和数组一样, 可以用于存储一系列的元素, 但是链表和数组的实现机制完全不同,链表中的元素在内存不是连续的空间,链表的每个元素由一个存储元素本身(数据) ...
 
随机推荐
- Swift开发第九篇——Any和AnyObject&typealias和泛型接口
			
本篇分为两部分: 一.Swift中的Any和AnyObject 二.Swift中的typealias和泛型接口 一.Swift中的Any和AnyObject 在 Swift 中,AnyObject 可 ...
 - iOS tableView 静态单元格的实现
			
本文转自:http://home.cnblogs.com/u/wendingding/ iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一 ...
 - Hibernate连接mysql数据库并自动创建表
			
天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...
 - Spring CharacterEncodingFilter
			
<!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> <filter-name>springUtf8Encoding</fi ...
 - python-1 python基础知识
			
python第一课代码笔记 hello world [root@heartbeat-data- python]# vim hello1.py #!/usr/bin/env python print ( ...
 - 今天说一下where 中 exists 和 in 里面的一些区别
			
in 和 exists 已经成为我们日常查询时候的常客了.很多时候他们2个都是可以互通实现的,但是,无论兄弟怎么亲,还是会有那么一些差别的. 先搞个测试表 )) ),Col2 )) INSERT IN ...
 - Java Dom解析的三个实例
			
概述 Dom解析的文章已经烂大街了.在这里,只举三个场景下如何编码的例子: xml内有多个同名节点,获取这多个同名节点 已获取到某个节点,生成这个节点的xml描述 修改节点某属性的值 详细的讲解看官请 ...
 - Java的SPI机制与简单的示例
			
一.SPI机制 这里先说下SPI的一个概念,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SPI就是Service ...
 - Navicat for MySQL 工具注册码
			
在使用 MySQL 客户端中,感觉 Navicat for MySQL 做的还是很不错的.鄙人比较懒,喜欢采用绿色安装的方式,百度网盘上备份的有个绿色的压缩包,解压打开需要注册,这里记录一下注册码,版 ...
 - 启动mysql错误ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
			
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ ( ...