javascript中在連結串列中向前(向後)移動n個節點

nd發表於2016-10-16

 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();

 

相關文章