日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/5/22 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环控制-链表反转(与创建链表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0.目錄

1.循環控制

2.Java代碼實現

  • 2.1 創建鏈表和遞歸反轉實現
  • 2.2 循環反轉思路
  • 2.3 鏈表反轉的實現
  • 2.4 測試用例
  • 2.5 循環控制-創建鏈表

1.循環控制

循環書寫方法:

  • 定義循環不變式,并在循環體每次結束后保持循環不變式
  • 一般 ,后特殊
  • 每次 必須 向前推進循環不變式中涉及的變量值
  • 每次推進的規模必須為 1

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

2.Java代碼實現

2.1 創建鏈表和遞歸反轉實現

前面已經寫過遞歸的版本了,傳送門:
遞歸控制-鏈表反轉

本篇結點和創建鏈表的實現同前文 遞歸控制-創建鏈表

2.2 循環反轉思路

1.先考慮循環中的某一個情況——循環到3時,應該要實現哪些操作?

2.此時應該要把3 → 4的指針改為3 → 2,而4作為剩下的第一個結點。
為了實現這一功能,加入兩個指針newHead(指向反轉成功的鏈表)和curHead(指向還沒有反轉的鏈表):

3.所以每一次循環做的操作就是跟隨兩個指針往后移:

4.總體來看就是用兩個指針從頭循環到尾一步步地反轉鏈表:

2.3 鏈表反轉的實現

依據反轉思路實現循環代碼即可。

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:不需要在開頭處理:if(head = null),程序也能夠很好的處理特殊情況。

驗證在循環最后一步時程序的正確性:

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 測試用例

測試程序是否正確運行(采用之前遞歸實現的測試用例):

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))));}

運行結果為

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 循環控制-創建鏈表

最后再把創建鏈表的遞歸實現也改為循環實現:

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;}

測試一下:

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)));}

運行結果:

轉載于:https://www.cnblogs.com/PyLearn/p/10039206.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。