最近在看數(shù)據(jù)結(jié)構(gòu)與算法JavaScript描述,在鏈表這一章遇到了點問題,問題描述如下
要刪除鏈表中的item節(jié)點,prevNode是item節(jié)點的前一個節(jié)點
書中用了 prevNode.next = prevNode.next.next; 來改變鏈表的指向。
但是我的理解是prevNode.next = item,然后試著利用prevNode.next = item.next刪除鏈表,但是這時候的結(jié)果相當(dāng)于就把鏈表斷開了,只留下了prevNode和之前的節(jié)點。
希望各路大神能解答一下疑惑,萬分感謝。
感謝 改名字很傷神 的指正,以下是書中的代碼
//Node類表示節(jié)點
function Node(element){
this.element = element;
this.next = null;
}
//LinkedList類提供了插入節(jié)點、刪除節(jié)點、顯示列表元素的方法以及其他一些輔助方法
function LList(){
this.head = new Node("head"); //head節(jié)點的next屬性被初始化為null,當(dāng)有新元素插入時,next會指向新的元素,所以這里沒有修改next的值
this.find = find;
this.findPrevious = findPrevious;
this.insert = insert;
this.remove = remove;
this.display = display;
}
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;
current.next = newNode;
}
//remove方法要先找到要刪除item的前一個node
function findPrevious(item){
var currNode = this.head;
while(!(currNode.next==null) && (currNode.next.element!=item)){
currNode=currNode.next;
}
return currNode;
}
function remove(item){
var prevNode = this.findPrevious(item);
if(!(prevNode.next==null)){
prevNode.next = prevNode.next.next; //###########這一句是有疑惑的地方
}
}
function display(){
var currNode = this.head;
while(!(currNode.next==null)){
console.log(currNode.next.element); //當(dāng)前下一個節(jié)點中保存的數(shù)據(jù)current.next.element
currNode = currNode.next;
}
}
//測試程序
var cities = new LList();
cities.insert('徐州','head');
cities.insert('蘇州','徐州');
cities.insert('南京','蘇州');
cities.insert('無錫','南京');
cities.display()
console.log(cities.find('蘇州'))
cities.remove('蘇州');
cities.display();
console.log(cities.find('head'))
此時輸出的結(jié)果是:
但是如果我把remove()方法里面的prevNode.next = prevNode.next.next;
改成prevNode.next = item.next;結(jié)果就變成下圖所示
看了下你貼的代碼,是你把此item和彼item理解混了
function remove(item){
var prevNode = this.findPrevious(item);
if(!(prevNode.next==null)){
prevNode.next = prevNode.next.next; //###########這一句是有疑惑的地方
}
}
這里的item其實應(yīng)該是itemName
function remove(itemName){
var prevNode = this.findPrevious(itemName);
if(!(prevNode.next==null)){
prevNode.next = prevNode.next.next; //###########這一句是有疑惑的地方
}
}
所以按你的方法應(yīng)該這樣寫
function remove(itemName){
var item = this.find(itemName);
var prevNode = this.findPrevious(itemName);
if(!(prevNode.next==null)){
prevNode.next = item.next; //###########這一句是有疑惑的地方
}
}北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。