反轉(zhuǎn)單向鏈表 c 大神!怎么理解鏈表這個(gè)反轉(zhuǎn)函數(shù)?
c 大神!怎么理解鏈表這個(gè)反轉(zhuǎn)函數(shù)?首先,P是指向shape類(lèi)的指針,指向當(dāng)前元素,q是復(fù)制P的指針,它用來(lái)反轉(zhuǎn)鏈表的位置,R是指向上一個(gè)位置的指針,while(P),也就是while(P!=nul
c 大神!怎么理解鏈表這個(gè)反轉(zhuǎn)函數(shù)?
首先,P是指向shape類(lèi)的指針,指向當(dāng)前元素,q是復(fù)制P的指針,它用來(lái)反轉(zhuǎn)鏈表的位置,R是指向上一個(gè)位置的指針,while(P),也就是while(P!=null),表示r=q是copy q的值,即指向上一個(gè)位置的指針,q=P是copy的當(dāng)前地址,P=P->next是將P向后移動(dòng),q->next=r是將q指向r,即后者是指在最后一步,當(dāng)P=null時(shí),q仍然保持鏈表的結(jié)尾。此時(shí),用Q替換head,將鏈的頭部改為鏈表的尾部,并結(jié)束整個(gè)反轉(zhuǎn)
單鏈表反轉(zhuǎn):例如,原來(lái)的鏈表是head->
1->
2->
3-> NULL。反轉(zhuǎn)后,head->3->2->1->null實(shí)現(xiàn)代碼:#include
如何鏈表反轉(zhuǎn)?
反轉(zhuǎn)單個(gè)鏈表。R示例:[R
advanced:可以迭代或遞歸地反轉(zhuǎn)鏈表。你能用兩種方法解決這個(gè)問(wèn)題嗎?采用頭部插入法。R代碼
問(wèn)題:給出一個(gè)單向列表并從頭到尾反轉(zhuǎn)它。例如:a-B-C-D依次是D-C-B-a。分析:假設(shè)每個(gè)節(jié)點(diǎn)的結(jié)構(gòu)是:復(fù)制如下代碼:類(lèi)節(jié)點(diǎn){char valuenode next},因?yàn)樵诜崔D(zhuǎn)鏈表時(shí),我們需要更新每個(gè)節(jié)點(diǎn)的“next”值。但是,在更新下一個(gè)值之前,需要保存下一個(gè)值,否則無(wú)法繼續(xù)。因此,我們需要兩個(gè)指針?lè)謩e指向前一個(gè)節(jié)點(diǎn)和下一個(gè)節(jié)點(diǎn)。在更新當(dāng)前節(jié)點(diǎn)的“next”值之后,我們向下移動(dòng)這兩個(gè)節(jié)點(diǎn),直到到達(dá)最后一個(gè)節(jié)點(diǎn)。代碼如下:public node reverse(node current){//initializationnode previousnode=nullnode nextnode=nullwhile(current!=null){//保存下一個(gè)nodenextnode=current.next//update當(dāng)前.next//update“下一步”的值當(dāng)前.下一個(gè)=previousNode//shift指針previousNode=currentcurrent=nextNode}return previousNode}上面的代碼使用非遞歸方法,也可以通過(guò)遞歸來(lái)解決。代碼如下:復(fù)制代碼如下:public node reverse(node current){if(current==null)|當(dāng)前.下一個(gè)==null)返回currentNode nextNode=當(dāng)前.nextcurrent.next=Nullnode reverserest=reverse(nextnode)return reverserest}遞歸方法實(shí)際上非常巧妙。它使用遞歸轉(zhuǎn)到鏈表的末尾,然后更新每個(gè)節(jié)點(diǎn)的下一個(gè)值(代碼的倒數(shù)第二句)。
如何反向輸出一個(gè)鏈表?
如果head節(jié)點(diǎn)是l,則有p=q=l/*p,q是指向head節(jié)點(diǎn)的兩個(gè)指針*/while(p->next!=null)P=P->next/*讓P指向鍵列表中要訪(fǎng)問(wèn)的最后一個(gè)節(jié)點(diǎn)*/while(1){while(Q->next!=P)q=q->next/*讓q向后看以找到最后一個(gè)要打印的節(jié)點(diǎn)*/printf(%dn,P->data)P=q/*P向前移動(dòng)一個(gè)*/q=L/*q還引用頭節(jié)點(diǎn)*/if(P=L)/*exit after accessing*/break}供您參考