二、列表(java)
目錄
一、單項(xiàng)列表
二、雙向列表
三、約瑟夫問題(單項(xiàng)列表)
一、單項(xiàng)列表
?
鏈表的優(yōu)點(diǎn):
由于鏈表上的元素在空間存儲上內(nèi)存地址不連續(xù)。
所以隨機(jī)增刪元素的時候不會有大量元素位移,因此隨機(jī)增刪效率較高。
在以后的開發(fā)中,如果遇到隨機(jī)增刪集合中元素的業(yè)務(wù)比較多時,建議
使用LinkedList。
鏈表的缺點(diǎn):
不能通過數(shù)學(xué)表達(dá)式計(jì)算被查找元素的內(nèi)存地址,每一次查找都是從頭
節(jié)點(diǎn)開始遍。
注意:
public class ListNode{int val;ListNode next; //鏈表指向的下一個值的指針ListNode(int x){val = x;} //這個方式賦值 }?
通過xx.next = new ListNode(4);來賦值,注意此時是賦值給下一個指針指向的位置,此時此鏈表一個值,值為4。
單項(xiàng)列表例子
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);//往鏈表中插入數(shù)據(jù)(在最后插入)public void add(GoodsNode goodsNode) {GoodsNode temp = node;while (true) {if (temp.next == null) {break;}temp = temp.next;}temp.next = goodsNode;}//添加節(jié)點(diǎn)(按照順序)//按照商品id進(jìn)行排序,從小到達(dá)按順序添加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;}}//修改節(jié)點(diǎn)//1、直到鏈表中的最后—個節(jié)點(diǎn)未找到,則結(jié)束循環(huán)//2、找到了節(jié)點(diǎn),結(jié)束循環(huán)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){//真正的修改節(jié)點(diǎn)temp.name=goodsNode.name;temp.price=goodsNode.price;}else {System.out.println("在整個鏈表中未找到鏈表節(jié)點(diǎn)");}}//刪除節(jié)點(diǎn)//條件:根據(jù)節(jié)點(diǎn)的編號刪除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("未找到刪除的節(jié)點(diǎn)");}}//查詢列表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,"耐克運(yùn)動鞋",599.00);GoodsNode goodsNode2 = new GoodsNode(2,"耐克上衣",399.00);GoodsNode goodsNode3 = new GoodsNode(3,"阿迪達(dá)斯運(yùn)動鞋",699.00);GoodsNode goodsNode4 = new GoodsNode(4,"李寧運(yùn)動鞋",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);//添加結(jié)尾新的節(jié)點(diǎn)public void addLast(BookNode newNode) {BookNode temp = head;while (true) {//如果第一次進(jìn)入,表示雙向鏈表是空數(shù)據(jù)if (temp.next == null) {break;}temp = temp.next;}temp.next = newNode;newNode.pre = temp;}//根據(jù)順序添加新的列表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;}}}//修改節(jié)點(diǎn)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("未找到修改的節(jié)點(diǎn)");}}//刪除節(jié)點(diǎn)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();} }三、約瑟夫問題(單項(xiàng)列表)
約瑟夫問題的示意
osephu 問題為:設(shè)編號為1,2,… n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報(bào)數(shù),數(shù)到m 的那個人出列,它的下一位又從1開始報(bào)數(shù),數(shù)到m的那個人又出列,依次類推,直到所有人出列為止,由此產(chǎn)生一個出隊(duì)編號的序列。
n = 5 , 即有5個人
k = 1, 從第一個人開始報(bào)數(shù)
m = 2, 數(shù)2下
構(gòu)建環(huán)形鏈表
約瑟夫問題代碼展示
//節(jié)點(diǎn)的對象 public class Boy {//結(jié)點(diǎn)編號private int no;//指向下一個節(jié)點(diǎn)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);//構(gòu)建環(huán)形鏈表public void addBoy(int nums){if(nums<1){System.out.println("數(shù)據(jù)不正確");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;}}}//查看環(huán)形鏈表中的節(jié)點(diǎn)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();}} //當(dāng)調(diào)用該方法輸入第幾個小孩子數(shù)數(shù),數(shù)幾次,環(huán)形鏈表中一共幾個小孩public void countBoy(int startNo,int countNum,int nums ){if(first==null||startNo<1||startNo>nums){System.out.println("參數(shù)輸入有錯");return;}//定義輔助指點(diǎn),指向的是環(huán)形單鏈表中的最后一個節(jié)點(diǎn)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();}//當(dāng)小孩進(jìn)行報(bào)數(shù)時,數(shù)到m的小孩進(jìn)行出列,讓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 出列\(zhòng)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);} }總結(jié)
以上是生活随笔為你收集整理的二、列表(java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(1663):前端系列实战课程之
- 下一篇: 易语言服务器卡密验证,想写一个关于辅助登