合併有序兩個單鏈表,合併後鏈表依然有序

来源:https://www.cnblogs.com/dong9012/archive/2020/06/02/13034333.html
-Advertisement-
Play Games

最近在學習數據結構,特此記錄一下,方便以後查閱. 1 //定義一個類來管理我們的英雄 也就是鏈表 2 class SingleLinkedList{ 3 //先初始化一個頭節點,頭節點不能動,用於尋找鏈表的頭 4 private HeroNode head = new HeroNode(0,""," ...


最近在學習數據結構,特此記錄一下,方便以後查閱.

 1 //定義一個類來管理我們的英雄 也就是鏈表
 2 class SingleLinkedList{
 3     //先初始化一個頭節點,頭節點不能動,用於尋找鏈表的頭
 4     private HeroNode head = new HeroNode(0,"","");
 5 
 6     public HeroNode getHead() {
 7         return head;
 8     }
 9     
10 
11     public void addOrderByNo(HeroNode heroNode){
12         //定義一個變數來輔助遍歷
13         HeroNode temp = head;
14         boolean flag = false;//用來判斷數據書否存在的
15 
16         while (true){
17             //為鏈表的最後
18             if(temp.next==null){
19                 break;
20             }
21             //如果下一個節點的數字已經大於現在要添加的數了 證明已經找到了 當前要添加的位置
22             if(temp.next.no>heroNode.no){
23                 break;
24             }
25             //如果等於要添加的數 證明這個數據已經添加過了 不能在添加
26             if(temp.next.no==heroNode.no){
27                 flag = true;//證明存在
28                 break;
29             }
30             //沒找到後移temp
31             temp = temp.next;
32         }
33 
34         //判斷flag的值
35         if(!flag){
36             //插入數據到鏈表中
37             //1.先將添加的數據的next指向下一個數據
38             heroNode.next = temp.next;
39             //2.再將temp的next指向添加的數據
40             temp.next = heroNode;
41         }else{
42             System.out.printf("準備插入的英雄的編號 %d 已經存在了, 不能加入\n", heroNode.no);
43         }
44     }
45 }
46 
47 class HeroNode{
48     public int no;
49     public String name;
50     public String nickname;
51     public HeroNode next; //指向下一個節點
52 
53     public HeroNode(int no, String name, String nickname) {
54         this.no = no;
55         this.name = name;
56         this.nickname = nickname;
57     }
58 
59     @Override
60     public String toString() {
61         return "HeroNode{" +
62                 "no=" + no +
63                 ", name='" + name + '\'' +
64                 ", nickname='" + nickname + '\'' +
65                 '}';
66     }
67 }
 1 /**
 2      * 合併兩個有序的單鏈表 使合併完成之後的新的鏈表依舊有序
 3      * @param hero1
 4      * @param hero2
 5      */
 6     public static HeroNode mergeList(HeroNode hero1, HeroNode hero2){
 7 
 8         //創建一個新的鏈表
 9         HeroNode hero3 = new HeroNode(0,"","");
10 
11         HeroNode temp1 = hero1.next;
12         HeroNode temp2 = hero2.next;
13         HeroNode temp3 = hero3;
14 
15         HeroNode next1 = null;//用於保存下一個節點
16         HeroNode next2 = null;
17         while(temp1!=null&&temp2!=null){
18             if(temp1.no<temp2.no){
19                 next1 = temp1.next;//先保存下一個節點
20                 temp3.next = temp1;//將較小的節點插入到新的節點後面
21                 temp3 = temp3.next;//將新的節點後移一位 註意:一定要後移
22                 temp1 = next1;//將節點後移一位
23             }else{
24                 next2 = temp2.next;
25                 temp3.next = temp2;
26                 temp3 = temp3.next;
27                 temp2 = next2;
28             }
29         }
30         if(temp1 == null){
31             while (temp2 !=null){
32                 next2 = temp2.next;
33                 temp3.next = temp2;
34                 temp3 = temp3.next;
35                 temp2 = next2;
36             }
37         }else{
38             while (temp1!=null){
39                 next1 = temp1.next;//先保存下一個節點
40                 temp3.next = temp1;//將較小的節點插入到新的節點後面
41                 temp3 = temp3.next;//將新的節點後移一位 註意:一定要後移
42                 temp1 = next1;//將節點後移一位
43             }
44         }
45         return hero3;
46     }
 1 public static void main(String[] args) {
 2         HeroNode heroNode1 = new HeroNode(1,"李1","木子李1");
 3         HeroNode heroNode2 = new HeroNode(2,"李2","木子李2");
 4         HeroNode heroNode3 = new HeroNode(3,"李3","木子李3");
 5         HeroNode heroNode4 = new HeroNode(4,"李4","木子李4");
 6 
 7         HeroNode heroNode5 = new HeroNode(5,"李5","木子李5");
 8         HeroNode heroNode6 = new HeroNode(6,"李6","木子李6");
 9         HeroNode heroNode7 = new HeroNode(7,"李7","木子李7");
10         HeroNode heroNode8 = new HeroNode(8,"李8","木子李8");
11 
12         SingleLinkedList list = new SingleLinkedList();
13 
14         list.addOrderByNo(heroNode1);
15         list.addOrderByNo(heroNode3);
16         list.addOrderByNo(heroNode5);
17         list.addOrderByNo(heroNode7);
18 
19         SingleLinkedList list2 = new SingleLinkedList();
20         list2.addOrderByNo(heroNode2);
21         list2.addOrderByNo(heroNode4);
22         list2.addOrderByNo(heroNode6);
23         list2.addOrderByNo(heroNode8);
24         
25         //合併兩個鏈表
26         HeroNode heroNode = mergeList(list.getHead(), list2.getHead());
27     }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 最近瞭解到很多朋友對限流、熔斷、降級、隔離、超時重試的概念和應用場景理解的不是很到位,所以想用五篇的篇幅稍微系統的介紹一下。 本篇是第一篇,是限流做詳解,如果反饋好的話,我會繼續寫下麵四篇。不好的話就算了,算我理解不夠,再自己總結總結。 限流的概念 有朋友問我限流和熔斷有什麼區別,我的理解很簡 ...
  • 老孟導讀:歷時1年的時間,整理完成了330+組件的詳細用法,不僅包含UI組件,還包含了功能性的組件。 雖然整理了 330+的組件基本用法,但並不是讓你每一個都學習一遍,任何技術基本都是掌握 20%就可以解決 80%的問題,因此只需學會基礎組件就可以上手項目了,至於其他的控制項只需大概瀏覽一下,做項目的 ...
  • 19. 文件讀寫 19.1 文件操作 數據持久化,是將程式中的對象以數據的方式保存到磁碟上,在程式下次運行時,可以將數據從磁碟上恢復到記憶體中。數據持久化的方式有很多,而最為常見的方式是將數據以文件的形式保存。在Python中,可以通過內置函數的方法進行文件的讀、寫、刪除等操作。 19.1.1 文件的 ...
  • 18.目錄與文件 18.1 os和shutil 日常使用過程中,難免需要使用跟文件系統相關的標準庫。在使用Python文件系統中,常用的庫為os和shutil標準庫,方法如下所示: import os import shutil 18.1.1 遍歷文件夾 os.getcwd():獲取當前工作目錄,返 ...
  • 1 import tkinter 2 import subprocess 3 import os 4 import time 5 import re 6 import sys 7 from tkinter import Label, Button, StringVar 8 from tkinter. ...
  • 在c/c++中,為瞭解決一些頻繁調用的小函數大量消耗棧空間(棧記憶體)的問題,特別的引入了inline修飾符,表示為內聯函數。 棧空間就是指放置程式的局部數據(也就是函數內數據)的記憶體空間。 在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足而導致程式出錯的問題,如,函數的死迴圈遞歸調用 ...
  • 類規範:包括類聲明以及類方法定義 類聲明提供類的藍圖 方法定義提供細節 常見不通用的約定:類名首字母大寫 類介面: 介面由編寫類的人提供的方法組成。介面讓程式員能夠編寫與類對象交互的代碼,從而讓程式能夠使用類對象。 要使用某個類,必須瞭解其公共介面;要編寫類,必須創建其公共介面。 通常,C++程式員 ...
  • @(目錄) 我的經歷 關註我的朋友都知道,關註兩個字劃重點,要考! 我最近一直在寫Spring的文章,而且僅僅是Spring FrameWork的文章 ,從最開始的官網入門到現在源碼的深度分析。主要就是三個系列 官網入門系列,Spring官網讀書筆記,這一系列的文章是入門Spring的不二之選,也是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...