本文全部都為單向鍊錶
鍊錶儲存有序的元素集合,但不同於陣列,鍊錶中的元素在記憶體中並不是連續放置的。每個元素由乙個儲存元素本身的節點和乙個指向下乙個元素的引用(也稱指標或鏈結)組成。下圖展示了乙個鍊錶的結構:
下面我們來實現乙個鍊錶以及鍊錶中的方法
//定義鍊錶
function linklist()
var length = 0; //長度
var head = null;//頭節點
var tail = null;//尾節點
//新增乙個新節點 在尾部新增
var node = new node(data);
if(!head)else
length +=1; //長度+1
return true;
};//列印鍊錶
this.print=function()
str += "null";
console.log(str);
console.log(`長度為$`)
};//在鍊錶指定位置新增節點
this.insert=function (index,data)else if(index == length)elseelse
//這裡就是插入位置前乙個節點next指向插入節點 插入節點next指向插入位置前乙個節點的next
var next_node=curr_node.next;
curr_node.next=new_node;
new_node.next=next_node;
}length +=1;
return true;}};
//在鍊錶指定位置刪除節點
this.remove=function (index)elseelse
del_node = curr_node.next;
//刪除的位置前乙個節點的next等於刪除節點的後乙個節點
curr_node.next=curr_node.next.next;
if(curr_node.next == null)
}length -=1;
return del_node.data;}};
//返回指定位置節點的值
this.get=function(index)
var node_index=0;
var curr_node=head;
while(node_index < index)
return curr_node.data;
};//返回指定元素索引
this.indexof=function(data)else
}return -1;
};// isempty
this.isempty = function();
// 清空鍊錶
this.clear = function();
// 返回煉表頭節點的值
this.head = function();
// 返回鍊錶尾節點的值
this.tail = function();
//返回鍊錶大小
this.length = function();
}var a=new linklist();
鍊錶已經定義完成;
下面我們運用遞迴與迭代的方法實現反轉鍊錶:
var node = function(data)
var node1 = new node(1);
var node2 = new node(2);
var node3 = new node(3);
var node4 = new node(4);
var node5 = new node(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
function print(node)
};print(node1)
// 迭代翻轉
function reverse_iter(head)
var pre_node = null; //當前節點的前乙個節點
var curr_node = head;//當前要翻轉的節點
while(curr_node)
//最後要返回pre_node,當迴圈結束時,pre_node指向翻轉前鍊錶的最後⼀乙個節點
return pre_node;
};// 遞迴翻轉
//遞迴的思想,精髓之處在於甩鍋,你做不到的事情讓別人去做,等別人做完了,你在別人的基礎上去做
function reverse_iter(head)
if(head.next == null)
//從下一節點開始進行翻轉
var new_head=reverse_iter(head.next);
//把當前節點連線到鍊錶上
head.next.next=head;
head.next=null;
return new_head;
}
下面我們將兩個有序鍊錶合併成乙個有序列表
/合併兩個有序鍊錶
var node = function(data)
var node1 = new node(1);
var node2 = new node(4);
var node3 = new node(9);
var node4 = new node(2);
var node5 = new node(5);
var node6 = new node(6);
var node7 = new node(10);
node1.next = node2;
node2.next = node3;
node4.next = node5;
node5.next = node6;
node6.next = node7;
function merge_link(head1, head2)else if(head2 == null)
var merge_head=null;// 合併後鍊表頭
var merge_tail=null;// 合併後鍊錶尾
var curr_1=head1;
var curr_2=head2;
while(curr_1 && curr_2)else
if(merge_head == null)else
}// 鍊錶可能還有⼀一部分沒有合併進來
var rest_link =null;
if(curr_1)else if(curr_2)
merge_tail.next = rest_link;
while(rest_link)
console.log(merge_tail);
return merge_head;
};console.log(merge_link(node1, node4));
通過上面的練習相信大家對鍊錶已經熟悉 鍊錶 合併有序鍊錶
題目 將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 題解我們這裡利用到了乙個前哨節點,因為兩個鍊錶實際上是已經排好序了,所以我們只需要比較兩個節點誰大誰小,找到小的接上去,然後那個...
鍊錶 合併有序鍊錶
將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。leetcode21 class solution else head head.next head.next l1 null?l2 l1 return result.next class solut...
合併有序鍊錶
將兩個有序的鍊錶合併為乙個新鍊錶,要求新的鍊錶是通過拼接兩個鍊錶的節點來生成的,即不開闢新的記憶體空間 首先,為了方便操作鍊錶,我們定義乙個dummyhead,我們遍歷兩個鍊錶,直到其中有乙個到達尾部,則停下來 在遍歷的過程中,我們將元素值小的節點依次鏈在mergerlist的後邊,最後,我們看看哪...