java創(chuàng)建鏈表 鏈表的就地逆置是什么意思?
鏈表的就地逆置是什么意思?例如,鏈表a->B->C->D有一個(gè)頭和一個(gè)尾。局部反轉(zhuǎn)意味著a<-B<-c< Da成為表尾,d成為表頭。假設(shè)structlink{intvalues
鏈表的就地逆置是什么意思?
例如,鏈表a->B->C->D有一個(gè)頭和一個(gè)尾。局部反轉(zhuǎn)意味著a<-B<-c< Da成為表尾,d成為表頭。假設(shè)structlink{intvaluestructlink*next}structlinka,B,C,Da->next=&BB->next=&CC->next=&DD->next=0,在反轉(zhuǎn)之后,B->next=&AC->next=&BD->next=&CA->next=0,所謂的局部反轉(zhuǎn)意味著在操作中遇到a->next=&B時(shí),重寫為B->next=&A
兩種單鏈表局部逆(遞歸和普通循環(huán))1。采用遞歸算法,對(duì)無前導(dǎo)節(jié)點(diǎn)的單鏈表(A1、A2、A3、A4、A5、A6)進(jìn)行反向設(shè)置后得到(A6、A5、A4、A3、A2、A1)??紤]遞歸算法,如果只有一個(gè)節(jié)點(diǎn),它將直接返回。如果有兩個(gè)節(jié)點(diǎn)(A1,A2),則要執(zhí)行的操作是:A2->next=A1,A1->next=NullReturn A2a2是新的頭節(jié)點(diǎn)。如果有三個(gè)節(jié)點(diǎn),則應(yīng)首先反轉(zhuǎn)子鏈(A2,A3),并返回子鏈的新頭節(jié)點(diǎn)。然后將子鏈(A2,A3)看作一個(gè)復(fù)合節(jié)點(diǎn)A2”,形成一個(gè)新的二進(jìn)制(A1,A2”),然后可以執(zhí)行具有相同前面的操作:A2“->next=A1,A1->next=NullReturn A3”,即可以以相同的方式獲得多個(gè)節(jié)點(diǎn),node*reverse(node*head){node*P=head if(P==null)return null//如果是空鏈表,則返回一個(gè)空節(jié)點(diǎn)*q=P->next if(q==null)return P//如果只有一個(gè)節(jié)點(diǎn),則返回else head=reverse(q)//記錄子序列的新head q->next=P//將當(dāng)前節(jié)點(diǎn)和反向子序列視為前后兩個(gè)節(jié)點(diǎn)P、q。執(zhí)行相應(yīng)的反向操作p->next=null return head//返回新子序列的head節(jié)點(diǎn)}2。使用常用算法反向(head inserting method重建前導(dǎo)節(jié)點(diǎn)的新鏈表)node*reverse(node*head){node*P=head->next If(P)//如果鏈表不為空,則反向。否則,空操作{node*q=P->next head->next=null//在(P){P->next=head->next//建立鏈表head->next=P if(q)//操作空指針時(shí),將頭節(jié)點(diǎn)分開,你必須非常小心,容易犯錯(cuò)誤{P=q}q=P->next}否則斷開}返回頭部}