【資料結構】JavaScript實現單鏈表、單鏈表反轉
阿新 • • 發佈:2019-02-19
連結串列
連結也是一種儲存資料的工具,不同於陣列,連結串列中的元素並不是連續儲存的。因此不能通過下標去訪問。 連結串列分為單(向)連結串列,雙向連結串列,迴圈連結串列等。.今天來實現一下單鏈表。
單鏈表中的每個元素包括兩個兩個域,一個是儲存元素本身的域,另一個是指向一下一個節點的指標域
function LinkedList(){
var Node = function( ele ){
this.ele = ele; //ele 屬性代表插入的值
this.next = null; // next屬性 代表 指向下一個節點的指標
}
var head = null;
var length = 0;
// 向連結串列末尾插入一個元素
this.append = function(ele){
var node = new Node(ele);
var currentNode = null;
if( head === null){ // 列表為空,插入的節點是第一個頭結點
head = node;
}
else {
currentNode = head;
// 迴圈連結串列,直到最後一個節點
while( currentNode.next !== null ){
currentNode = currentNode.next;
}
// 出了while迴圈,說明找到了最後一個節點
currentNode.next = node;
}
length++;
}
// 刪除連結串列中指定的某個節點:刪除頭結點 or 除了頭結點以外的節點
this.removeAt = function( position ){
var currentNode = head;
var previousNode = null;
var index = 0;
if( position >= 0 && position < length ){
if( position === 0 ){
node = currentNode.next;
}
else{
while( index++ < position ){
previousNode = currentNode;
currentNode = currentNode.next;
}
// 出了while迴圈, index === position
previousNode.next = currentNode.next;
}
length--;
return currentNode.ele
}
// 要刪除的節點的不存在
else{
return -1;
}
}
// 在任意位置插入一個元素
this.insert = function(){
// 檢查是否越界
if( position >= 0 && position <= length ){
var newNode = new Node(ele);
var currentNode = head; // 儲存一下頭結點
var previousNode = null;
var index = 0;
if( position === 0 ){
newNode.next = currentNode;
head = newNode;
}
else{
while ( index++ < position ){
previousNode = currentNode;
currentNode = currentNode.next;
}
// 出了迴圈表示找到位置
newNode.next = currentNode;
previousNode.next = currentNode;
}
length++;
return 1;
}
else{
return -1;
}
}
//查詢連結串列中的某個元素所在位置, 無此元素返回 -1
this.find = function(ele){
var currentNode = head;
var index = 0;
while( currentNode ){
if( currentNode.ele = ele ){
return index;
}
currentNode = currentNode.next;
index++;
}
return -1;
}
this.isEmpty = function(){
return length === 0;
}
this.size = function(){
return length;
}
}
下面來實現連結串列的反轉
function reverse( linkedList ){
var head = linkedList.head;
// 如果只有一個節點 或者 是空連結串列
if( head === null || head.next === null ){
return;
}
var p = head;
var q = p.next;
// 反轉後的頭結點變成尾節點
head.next = null;
while(q){
r = q.next;
q.next = p;
p = q;
q = r;
}
// 退出迴圈後 r = q.next = null, q.next = q; p=q; q=null;
// p指向原來節點的尾節點, 那麼翻轉後,尾節點變成頭結點
linkedList.head = p;
}