js鍊錶實現與鍊錶反轉和合併有序鍊錶

2021-09-13 23:54:36 字數 3689 閱讀 7173

本文全部都為單向鍊錶

鍊錶儲存有序的元素集合,但不同於陣列,鍊錶中的元素在記憶體中並不是連續放置的。每個元素由乙個儲存元素本身的節點和乙個指向下乙個元素的引用(也稱指標或鏈結)組成。下圖展示了乙個鍊錶的結構:

下面我們來實現乙個鍊錶以及鍊錶中的方法

//定義鍊錶

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的後邊,最後,我們看看哪...