循环控制-链表反转(与创建链表)
生活随笔
收集整理的這篇文章主要介紹了
循环控制-链表反转(与创建链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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
總結
以上是生活随笔為你收集整理的循环控制-链表反转(与创建链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3-2 案例准备工作
- 下一篇: 自动化测试(三)如何用python写一个