单链表的基本操作

193 阅读2分钟

1.查找节点

在查找元素时,链表不像数组那样可以通过下标快速进行定位,只能从头节点开始向后一个一个节点逐一查找。

例如给出一个链表,需要查找从头节点开始的第3个节点。

2.更新节点

如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。

3.插入节点

1)尾部插入

尾部插入,是最简单的情况,把最后一个节点的next指针指向新插入的节点即可。

2)头部插入

头部插入,可以分成两个步骤。

第1步,把新节点的next指针指向原先的头节点。

第2步,把新节点变为链表的头节点。

3)中间插入

中间插入,同样分为两个步骤。

第1步,新节点的next指针,指向插入位置的节点。

第2步,插入位置前置节点的next指针,指向新节点。

只要内存空间允许,能够插入链表的元素是无穷无尽的,不需要像数组那样考虑扩容的问题。

4.删除节点

1)尾部删除

尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即可。

2)头部删除

头部删除,也很简单,把链表的头节点设为原先头节点的next指针即可。

3)中间删除

中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要删除元素的下一个节点即可。

实践

// 节点
function Node(element) {
    this.element = element; //当前节点的元素
    this.next = null; //下一个节点链接
}
// 插入节点
function insert ( newElement , item ) {
    var newNode = new Node( newElement );
    var currNode = this.find( item );
    newNode.next = currNode.next;
    currNode.next = newNode;
}
// 查找节点 function find ( item ) {
    var currNode = this.head;
    while ( currNode.element != item ){
        currNode = currNode.next;
    }
    return currNode;
}
//查找带删除节点的前一个节点
function findPrev( item ) {
    var currNode = this.head;
    while ( !( currNode.next == null) && ( currNode.next.element != item )){
        currNode = currNode.next;
    }
    return currNode;
}
//删除节点
function remove ( item ) {
    var prevNode = this.findPrev( item );
    if( !( prevNode.next == null ) ){
        prevNode.next = prevNode.next.next;
    }
}
//显示链表元素
function display () {
    var currNode = this.head;
    while ( !(currNode.next == null) ){
        console.log( currNode.next.element );
        currNode = currNode.next;
    }
}
function LList () {
    this.head = new Node( 'head' );     //头节点
    this.find = find;                   //查找节点
    this.insert = insert;               //插入节点
    this.remove = remove;               //删除节点
    this.findPrev = findPrev;           //查找前一个节点
    this.display = display;             //显示链表
}
    var fruits = new LList();
    fruits.insert('Apple' , 'head');
    fruits.insert('Banana' , 'Apple');
    fruits.insert('Pear' , 'Banana');
    console.log(fruits.display());
    fruits.remove('Banana');
    console.log(fruits.display());