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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二、列表(java)

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二、列表(java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、單項列表

二、雙向列表

三、約瑟夫問題(單項列表)


一、單項列表

?

鏈表的優點:

由于鏈表上的元素在空間存儲上內存地址不連續。

所以隨機增刪元素的時候不會有大量元素位移,因此隨機增刪效率較高。

在以后的開發中,如果遇到隨機增刪集合中元素的業務比較多時,建議

使用LinkedList。

鏈表的缺點:

不能通過數學表達式計算被查找元素的內存地址,每一次查找都是從頭

節點開始遍。

注意:

public class ListNode{int val;ListNode next; //鏈表指向的下一個值的指針ListNode(int x){val = x;} //這個方式賦值 }

?

通過xx.next = new ListNode(4);來賦值,注意此時是賦值給下一個指針指向的位置,此時此鏈表一個值,值為4。


單項列表例子

package Linked;public class GoodsNode {public int id;public String name;public Double price;@Overridepublic String toString() {return "GoodsNode{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}public GoodsNode next;public GoodsNode(int id, String name, Double price) {this.id = id;this.name = name;this.price = price;} } package Linked;public class DLLinkedList {GoodsNode node = new GoodsNode(0, "", 0.0);//往鏈表中插入數據(在最后插入)public void add(GoodsNode goodsNode) {GoodsNode temp = node;while (true) {if (temp.next == null) {break;}temp = temp.next;}temp.next = goodsNode;}//添加節點(按照順序)//按照商品id進行排序,從小到達按順序添加public void addOrder(GoodsNode goodsNode) {GoodsNode temp = node;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id > goodsNode.id) {break;} else if (temp.next.id == goodsNode.id) {flag = true;break;}temp = temp.next;}if (flag) {System.out.println("該商品已存在");} else {goodsNode.next = temp.next;temp.next = goodsNode;}}//修改節點//1、直到鏈表中的最后—個節點未找到,則結束循環//2、找到了節點,結束循環public void updateNode(GoodsNode goodsNode){//如果鏈表為空if(node.next==null){System.out.println("鏈表為空");return;}GoodsNode temp =node.next;boolean flag =false;while (true){if(temp==null){break;}if(temp.id==goodsNode.id){flag=true;break;}temp=temp.next;}if(flag){//真正的修改節點temp.name=goodsNode.name;temp.price=goodsNode.price;}else {System.out.println("在整個鏈表中未找到鏈表節點");}}//刪除節點//條件:根據節點的編號刪除public void delNode(int id) {GoodsNode temp = node;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id == id) {flag = true;break;}temp = temp.next;}if(flag){temp.next=temp.next.next;}else {System.out.println("未找到刪除的節點");}}//查詢列表public void list(){if(node.next==null){System.out.println("空鏈表");return;}GoodsNode temp =node.next;while (true){if(temp==null){break;}System.out.println(temp);temp=temp.next;}} } public class LinkedTest {public static void main(String[] args) {DLLinkedList linkedList = new DLLinkedList();GoodsNode goodsNode1 = new GoodsNode(1,"耐克運動鞋",599.00);GoodsNode goodsNode2 = new GoodsNode(2,"耐克上衣",399.00);GoodsNode goodsNode3 = new GoodsNode(3,"阿迪達斯運動鞋",699.00);GoodsNode goodsNode4 = new GoodsNode(4,"李寧運動鞋",499.00);linkedList.addOrder(goodsNode3);linkedList.addOrder(goodsNode1);linkedList.addOrder(goodsNode2);linkedList.addOrder(goodsNode4);linkedList.list();System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");linkedList.updateNode(new GoodsNode(1,"新科技鞋子",1999.9));linkedList.list();System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");linkedList.delNode(1);linkedList.list();} }

二、雙向列表

雙向列表例子?

public class BookNode {public int id;public String name;public double price;public BookNode next;public BookNode pre;public BookNode(int id, String name, double price) {this.id = id;this.name = name;this.price = price;}@Overridepublic String toString() {return "DualLinkedList{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}}

?

public class DualLinkedList {BookNode head = new BookNode(0, "", 0);//添加結尾新的節點public void addLast(BookNode newNode) {BookNode temp = head;while (true) {//如果第一次進入,表示雙向鏈表是空數據if (temp.next == null) {break;}temp = temp.next;}temp.next = newNode;newNode.pre = temp;}//根據順序添加新的列表public void addOrder(BookNode newNode) {BookNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id>newNode.id) {break;} else if (temp.id == newNode.id) {flag = true;break;}temp = temp.next;}if (flag) {System.out.println("該書已存在");} else {if(temp.next!=null){newNode.next=temp.next;temp.next.pre=newNode;temp.next=newNode;newNode.pre=temp;}else {temp.next=newNode;newNode.pre=temp;}}}//修改節點public void updateNode(BookNode node) {if (head.next == null) {System.out.println("空鏈表");return;}BookNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == node.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.name = node.name;temp.price = node.price;} else {System.out.println("未找到修改的節點");}}//刪除節點public void delNode(BookNode node) {if (head.next == null) {System.out.println("雙向鏈表為空");return;}BookNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == node.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.pre.next = temp.next;if (temp.next != null) {temp.next.pre = temp.pre;}}}public void list() {if (head.next == null) {System.out.println("空鏈表");return;}BookNode temp = head.next;while (true){if(temp==null){break;}System.out.println(temp);temp=temp.next;}} }

?

public class Test {public static void main(String[] args) {DualLinkedList dualLinkedList = new DualLinkedList();BookNode bookNode1= new BookNode(1,"紅樓夢",66.0);BookNode bookNode2= new BookNode(2,"西游記",66.0);BookNode bookNode3= new BookNode(3,"水滸傳",66.0);BookNode bookNode4= new BookNode(4,"三國演義",66.0);dualLinkedList.addOrder(bookNode3);dualLinkedList.addOrder(bookNode1);dualLinkedList.addOrder(bookNode2);dualLinkedList.addOrder(bookNode4);dualLinkedList.list();} }

三、約瑟夫問題(單項列表)

約瑟夫問題的示意

osephu 問題為:設編號為1,2,… n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m 的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生一個出隊編號的序列。

n = 5 , 即有5個人

k = 1, 從第一個人開始報數

m = 2, 數2下

構建環形鏈表


約瑟夫問題代碼展示

//節點的對象 public class Boy {//結點編號private int no;//指向下一個節點private Boy next;public Boy(int no) {this.no = no;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next = next;} } public class CircleSingleLinkedLList {private Boy first = new Boy(-1);//構建環形鏈表public void addBoy(int nums){if(nums<1){System.out.println("數據不正確");return;}Boy temp =null;for(int i = 1;i<=nums;i++){Boy boy = new Boy(i);//判斷是否是第一個小孩if(i==1){first= boy;first.setNext(first);temp=first;}else{temp.setNext(boy);boy.setNext(first);temp=boy;}}}//查看環形鏈表中的節點public void showBoy(){if(first==null){System.out.println("鏈表為空");return;}Boy boy =first;while (true){System.out.printf("小孩的編號%d\n",boy.getNo());if(boy.getNext()==first){break;}boy = boy.getNext();}} //當調用該方法輸入第幾個小孩子數數,數幾次,環形鏈表中一共幾個小孩public void countBoy(int startNo,int countNum,int nums ){if(first==null||startNo<1||startNo>nums){System.out.println("參數輸入有錯");return;}//定義輔助指點,指向的是環形單鏈表中的最后一個節點Boy helper = first;while (true){if(helper.getNext()==first){break;}helper=helper.getNext();}//尋找起始位置,把first定義為起始位置for(int j =0;j<startNo-1;j++){first=first.getNext();helper=helper.getNext();}//當小孩進行報數時,數到m的小孩進行出列,讓first和helper移動m-1次即可。//找到了出列小孩while (true){if(helper==first){break;}for(int j =0;j<countNum-1;j++){first=first.getNext();helper=helper.getNext();}System.out.printf("小孩子%d 出列\n",first.getNo());first=first.getNext();helper.setNext(first);}System.out.printf("最后出圈的小孩子編號%d\n",first.getNo());}} public class TestBoy {public static void main(String[] args) {CircleSingleLinkedLList circleSingleLinkedLList = new CircleSingleLinkedLList();circleSingleLinkedLList.addBoy(5);circleSingleLinkedLList.showBoy();circleSingleLinkedLList.countBoy(1,2,5);} }

總結

以上是生活随笔為你收集整理的二、列表(java)的全部內容,希望文章能夠幫你解決所遇到的問題。

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