鏈表有單鏈表和雙鏈表,概念可百度,這裏主要是以js的形式實現。
以下是我大概實現的思路
我們先定義一個類,說明一下這個鏈表的數據結構
所以我們需要定義節點,節點裏面有value(我們存儲的值)以及next(指向下個一節點)
function node(value){
this.value = value;
this.next = null; //在沒有下一個節點的時候,next總是指向null
}
那現在我們什麼不要想那麼複雜,一步一步思考,把需要的東西寫出來
第一步:要添加節點
- 判斷是否爲頭結點 所以需要一個head變量來標識頭結點,當然初始化爲空;
- 要跟蹤鏈表的長度 所以需要變量length來標識長度
所以先寫添加節點的方法: append(),我們把用到的所有方法寫到 singleList()類裏面, 作爲成員方法
function singleList(){
let head = null; //這定義頭結點,並且初始化爲null
let Length = 0; //這定義頭鏈表的長度,方便查看當前的長度
this.append = function(value){ //定義增加節點的方法
let currentNode; //定義當前節點
let node = new Node(value); //實例出一新的節點
if(head ===null){
head = node;
Length++;
}else{
currentNode = head;
while(currentNode.next){
currentNode = currentNode.next;
}
currentNode.next = node;
Length++;
}
return 'ok';
}
}
第二步:獲取節點的長度
- 直接返回Length就可以
function singleList(){
this.getLength = function(){ //直接返回Length
return Length;
}
}
第三步:展示已經添加的節點(數組形式展示)
this.showNode = function(){
let arr = []; //定義數組來放鏈表的節點值
let currentNode = head;
while(currentNode.next!=null){
arr.push(currentNode.value);
currentNode = currentNode.next;
}
arr.push(currentNode.value);
arr.push(1)
return arr;
}
第四步:刪除節點
- 刪除的是第幾個節點,這裏就要指定一個下標index ,(和數組的下標一樣從0開始算起的)
- 根據提供的index,找到節點,然後根據下圖示例
代碼實現如下:
this.delete = function(index){
let currentNode;
currentNode = head;
if(index>-1 && index <Length){ //判斷index合法不
if(index == 0){
head = currentNode.next;
}
else{
let current = 0;
while(current<index-1){
currentNode = currentNode.next
current++;
}
currentNode.next = currentNode.next.next; //直接指向下下個
}
Length--; //記得長度要自減
return this.showNode();
}
else{
throw new Error('index超過鏈表的長度啦!!!')
}
}
第五步:查找節點(根據下標index查找)
實現如下:
this.find = function(index){
let currentNode = head;
if(index>-1 && index <Length){
if(index ==0){
return head.value;
}
else{
let current =0
while(current<index){
currentNode = currentNode.next;
current++;
}
return {"當前節點數據爲":currentNode.value};
}
}
}
完整的代碼如下:
function singleList(){
function Node(value){
this.value = value;
this.next = null;
}
let head = null;
let Length = 0;
this.append = function(value){
let currentNode;
let node = new Node(value);
if(head ===null){
head = node;
Length++;
}else{
currentNode = head;
while(currentNode.next){
currentNode = currentNode.next;
}
currentNode.next = node;
Length++;
}
return 'ok';
}
this.getLength = function(){
return Length;
}
this.showNode = function(){
let arr = [];
let currentNode = head;
while(currentNode.next!=null){
arr.push(currentNode.value);
currentNode = currentNode.next;
}
arr.push(currentNode.value);
arr.push(1)
return arr;
}
this.delete = function(index){
let currentNode;
currentNode = head;
if(index>-1 && index <Length){
if(index == 0){
head = currentNode.next;
}
else{
let current = 0;
while(current<index-1){
currentNode = currentNode.next
current++;
}
currentNode.next = currentNode.next.next;
}
Length--;
return this.showNode();
}
else{
throw new Error('index超過鏈表的長度啦!!!')
}
}
this.find = function(index){
let currentNode = head;
if(index>-1 && index <Length){
if(index ==0){
return head.value;
}
else{
let current =0
while(current<index){
currentNode = currentNode.next;
current++;
}
return {"當前節點數據爲":currentNode.value};
}
}
}
}