首页 > 编程知识 正文

逆转线性链表算法,反转单向链表java

时间:2023-05-06 00:12:23 阅读:33497 作者:4355

1 packagecom.trs.codetool.sort; 2

3 /**

4 * @ author Zheng.Chang gang5* @ date 2020-01-020 93360576 *链表的常用算法7 */

8公共类连接{ 9静态节点头=新节点(0; 10 publicstaticvoidmain (string [ ] args ) 11 int [ ] nums={ 1,2,3,4,5 }; 12for(intI=0; I

16

17 /*//递归反转链表的18 nodeinvertnode=invert linked list (head.next ); 19 System.out.println (; 20 head.next=invertNode; 21打印节点(头); 22 //非递归反转链表23 iterationinvertlinkedlist (head ); 24打印节点(头); 25 Integer from=2; 26集成到=4; 27 //变形问题1 :给出链表的第一个节点head,以及两个整数from和to,反转链表中第from个节点和第to个节点的部分。 例如,如果给出以下链表,使from=2,to=4head----5----4---3---2---1反转,则链表为head------ 1 */

30 //变形问题2 :给出链表,每k个节点反转一对,返回反转的链表。 k是正整数,值小于或等于链表的长度。 如果节点总数不是k的整数倍,则最后剩下的节点将保持其原始顺序

31 iterationinvertlinkedlisteveryk (2; 32打印节点(头); 33

三十五)三十五

36 /**

每37 *个链表38 *@paramk39 */

40 publicstaticvoiditerationinvertlinkedlisteveryk (intk ) {41 Node tmp=head.next; 42 int step=0; //计数,找到第一个节点和最后一个节点

43

44节点开始=空; //k个链表的第一个节点

45节点startkpre=head; //k个链表中第一个节点的前置节点

46节点结束; //k个链表的末尾节点

47while(tmp!=null () {48 //tmp下一个节点由于翻转而改变tmp的后续节点,因此提前保存

49 Node tmpNext=tmp.next; 50if(step==0) {51 //k链表区间的开头节点

52 startK=tmp; 53步; 54 }找到else if (step==k-1 ) {55 //此时k个链表区间的末尾节点) endK ),反复反转该链表

56结束=tmp; 57节点pre=null; 58节点Cur=startk; 59if(cur==null ) {60 break; 61 ) 62nodeendknext=endk.next; 63while(cur!=endknext(64nodenext=cur.next; 65 cur.next=pre; 66 pre=cur; 67 cur=next; 69 ) 69//反转后,此时endK和startK分别是k个链表的首尾节点

70 startKPre.next=endK; 71 startK.next=endKNext; 72

73 //当前k个组的反转结束,下一个k个组的反转开始

74 startKPre=startK; 75步骤=0; 76 ) Else { 77步骤; 78 ) 79tmp=tmpnext; 八十(八十一)八十二

83 /**

84 *变形问题1 :给出链表的第一个节点head和两个整数from和to,在链表中反转from第一个节点和to第二个节点这一部分。 例如,如果给出以下链表,使from=2,to=4head----5----4---3---2---1反转,则链表为head------ 1

89私有语音invertlinkedlist (节点头、integer自索引、Integer toIndex ) /自1节点

91节点从pre=null; 92节点从=空; 93节点至=空; 94节点话题=空值; 95集成索引=1; 96 Node temp=head.getNext (; 97 //记录前节点

98while(temp!=null ) {99if(fromindex-1==index ) {100 fromPre=temp; 101 ) else if (从索引==索引) { 102从=temp; 103 ) elseif(toindex1==index ) {104 toNext=temp; 105 ) elseif(toindex==index ) {106 to=temp; 107 ) 108索引; 109 temp=temp.next; 110 ) 111

112节点pre=null; 113节点Cur=From; 14while(cur!=tonext (115节点下一步=cur.get下一步); 16cur.setnext(pre ); 117 pre=cur; 118 cur=next; 119 )将120//步骤from-1节点指向to节点,将from节点指向to 1节点(如果从head的后续节点翻转,则需要重新设置head的后续节点) () ) ) )

121 If (来自前!=null}{122frompre.next=to; 123 ) else(124head.next=to; 125 ) 126from.next=tonext; 127

128 ) 129

130 /**

131 *递归地反转链表132 *@paramnode133 *@return

134 */

135私有状态节点基础列表(节点节点) 136if )节点. next==null ) { 137返回节点; 138 ) 139节点新头=invert linked list ) node.next; 140 node.next.next=node; 141 node.next=null; 142返回新头; 143 ) 144

145 /**

146 *非递归反转147 *@paramnode148 */

149隐私声明invertlinkedlist (节点) { 150节点pre=null; 151 Node cur=node.next; 152while(cur!=null } { 153节点下一步=cur.next; 154cur.setnext(pre; 155 pre=cur; 156 cur=next; 157 ) 158节点. set next (pre ); 159

160 ) 161

162 /**

163 *打印节点164 */

165隐私保护打印节点(节点时间) { 166节点Cur=temp.next; 167while(cur!=null(168if ) cur.next!=null () 169系统. out.print ) cur.getvalue (() '-' ); 170 ) else(171system.out.print ) cur.getvalue (); 172 ) 173cur=cur.next; 174 ) 175 ) 176

177 /**

178 *节点179 *@paramnum180 */

181私密性声明(intnum ) {182 Node cur=head; 183while(cur.next!=null}{184cur=cur.next; 185 ) 186cur.next=newnode(num ); 187 ) 188

189 staticclassnode { 190专用集成电路; 191隐私节点下一步; 192

193公共节点(integer value ) {194 this.value=value; 195 ) 196

197 publicintegergetvalue ((198返回值; 199 ) 200

201公共语音设置(integer value ) {202 this.value=value; 203 ) 204

205 publicnodegetnext ((206返回下一步; 207 ) 208

209 publicvoidsetnext (节点下一步) {210 this.next=next; 211(212 ) 213 )

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。