日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

循环控制-链表反转(与创建链表)

發(fā)布時(shí)間:2025/5/22 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环控制-链表反转(与创建链表) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0.目錄

1.循環(huán)控制

2.Java代碼實(shí)現(xiàn)

  • 2.1 創(chuàng)建鏈表和遞歸反轉(zhuǎn)實(shí)現(xiàn)
  • 2.2 循環(huán)反轉(zhuǎn)思路
  • 2.3 鏈表反轉(zhuǎn)的實(shí)現(xiàn)
  • 2.4 測(cè)試用例
  • 2.5 循環(huán)控制-創(chuàng)建鏈表

1.循環(huán)控制

循環(huán)書(shū)寫方法:

  • 定義循環(huán)不變式,并在循環(huán)體每次結(jié)束后保持循環(huán)不變式
  • 一般 ,后特殊
  • 每次 必須 向前推進(jìn)循環(huán)不變式中涉及的變量值
  • 每次推進(jìn)的規(guī)模必須為 1

循環(huán)不表示(loop invariant):是一句斷言定義各變量所滿足的條件

2.Java代碼實(shí)現(xiàn)

2.1 創(chuàng)建鏈表和遞歸反轉(zhuǎn)實(shí)現(xiàn)

前面已經(jīng)寫過(guò)遞歸的版本了,傳送門:
遞歸控制-鏈表反轉(zhuǎn)

本篇結(jié)點(diǎn)和創(chuàng)建鏈表的實(shí)現(xiàn)同前文 遞歸控制-創(chuàng)建鏈表

2.2 循環(huán)反轉(zhuǎn)思路

1.先考慮循環(huán)中的某一個(gè)情況——循環(huán)到3時(shí),應(yīng)該要實(shí)現(xiàn)哪些操作?

2.此時(shí)應(yīng)該要把3 → 4的指針改為3 → 2,而4作為剩下的第一個(gè)結(jié)點(diǎn)。
為了實(shí)現(xiàn)這一功能,加入兩個(gè)指針newHead(指向反轉(zhuǎn)成功的鏈表)和curHead(指向還沒(méi)有反轉(zhuǎn)的鏈表):

3.所以每一次循環(huán)做的操作就是跟隨兩個(gè)指針往后移:

4.總體來(lái)看就是用兩個(gè)指針從頭循環(huán)到尾一步步地反轉(zhuǎn)鏈表:

2.3 鏈表反轉(zhuǎn)的實(shí)現(xiàn)

依據(jù)反轉(zhuǎn)思路實(shí)現(xiàn)循環(huán)代碼即可。

public Node reverseLinkedList(Node head) {Node newHead = null;Node curHead = head;// Loop invariant:// newHead points to the linked list already reversed.// curHead points to the linked list not yet reversed.while (curHead != null) {// Loop invariant holds.Node next = curHead.getNext();curHead.setNext(newHead);newHead = curHead;curHead = next;// Loop invariant holds.}// Loop invariant holds.return newHead;}

ps:不需要在開(kāi)頭處理:if(head = null),程序也能夠很好的處理特殊情況。

驗(yàn)證在循環(huán)最后一步時(shí)程序的正確性:

while (curHead != null) {// Loop invariant holds.Node next = curHead.getNext(); // next = nullcurHead.setNext(newHead); // curHead.next reversednewHead = curHead; // newHead points to lastcurHead = next; // curHead = null// Loop invariant holds.}

2.4 測(cè)試用例

測(cè)試程序是否正確運(yùn)行(采用之前遞歸實(shí)現(xiàn)的測(cè)試用例):

public static void main(String[] args) {LinkedListCreator creator = new LinkedListCreator();LinkedListReverser reverser = new LinkedListReverser();Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(new ArrayList<>())));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1, 2, 3, 4, 5))));}

運(yùn)行結(jié)果為

main所在java文件全部代碼:

import java.util.ArrayList; import java.util.Arrays;import interview.common.Node; import interview.recursion.LinkedListCreator;public class LinkedListReverser {public Node reverseLinkedList(Node head) {Node newHead = null;Node curHead = head;// Loop invariant:// newHead points to the linked list already reversed.// curHead points to the linked list not yet reversed.while (curHead != null) {// Loop invariant holds.Node next = curHead.getNext();curHead.setNext(newHead);newHead = curHead;curHead = next;// Loop invariant holds.}// Loop invariant holds.return newHead;}public static void main(String[] args) {LinkedListCreator creator = new LinkedListCreator();interview.recursion.LinkedListReverser reverser = new interview.recursion.LinkedListReverser();Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(new ArrayList<>())));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1, 2, 3, 4, 5))));} }

2.5 循環(huán)控制-創(chuàng)建鏈表

最后再把創(chuàng)建鏈表的遞歸實(shí)現(xiàn)也改為循環(huán)實(shí)現(xiàn):

public Node createLargeLinkedList(int size) {Node prev = null;Node head = null;for (int i = 1; i <= size; i++) {Node node = new Node(i);if (prev != null) {prev.setNext(node);} else {head = node;}prev = node;}return head;}

測(cè)試一下:

public static void main(String[] args) {LinkedListCreator creator = new LinkedListCreator();interview.recursion.LinkedListReverser reverser = new interview.recursion.LinkedListReverser();Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(new ArrayList<>())));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1, 2, 3, 4, 5))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLargeLinkedList(100)));}

運(yùn)行結(jié)果:

轉(zhuǎn)載于:https://www.cnblogs.com/PyLearn/p/10039206.html

總結(jié)

以上是生活随笔為你收集整理的循环控制-链表反转(与创建链表)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。