生活随笔
收集整理的這篇文章主要介紹了
java 块状链表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
節(jié)點(diǎn)類
package BlockLinkList;import java.util.ArrayList;public class BlockLinkNode {public BlockLinkNode prev;public BlockLinkNode next;public ArrayList<Integer> list;public BlockLinkNode(BlockLinkNode prev,BlockLinkNode next,ArrayList<Integer> list){this.prev=prev;this.next=next;this.list=list;}}
塊狀鏈表
package BlockLinkList;
import java.util.*;public class BlockLinkList {public BlockLinkNode blockLinkNode = null;private int total;public BlockLinkList(){//初始化節(jié)點(diǎn)// blockLinkNode = new BlockLinkNode(null,null,list);}public boolean IsExist(int num){boolean isExist = false;BlockLinkNode temp = blockLinkNode;while (temp != null){//判斷是否在該區(qū)間內(nèi)if (temp.list.size()-1 > 0 && num >= temp.list.get(0) && num <= temp.list.get(temp.list.size() - 1)){isExist = temp.list.indexOf(num) > 0 ? true : false;return isExist;}temp = temp.next;}return isExist;}public String Get(int num){int blockIndex = 0;int arrIndex = 0;BlockLinkNode temp = blockLinkNode;while (temp != null){//判斷是否在該區(qū)間內(nèi)if (temp.list.size()-1 > 0 && num >= temp.list.get(0) && num <= temp.list.get(temp.list.size()- 1)){arrIndex = temp.list.indexOf(num);return String.format("當(dāng)前數(shù)據(jù)在第{0}塊中的{1}個(gè)位置", blockIndex, arrIndex);}blockIndex = blockIndex + 1;temp = temp.next;}String str=null;str="";return str;}public BlockLinkNode Add(int num){return Add(blockLinkNode, num);}private BlockLinkNode Add(BlockLinkNode node, int num){if (node == null){return node;}else{/** 第一步:找到指定的節(jié)點(diǎn)*/if (node.list.size()== 0){node.list.add(num);total = total + 1;return node;}//下一步:再比較是否應(yīng)該分裂塊int blockLen = (int)Math.ceil(Math.sqrt(total)) * 2;//如果該節(jié)點(diǎn)的數(shù)組的最后位置值大于插入值,則此時(shí)我們找到了鏈表的插入節(jié)點(diǎn),//或者該節(jié)點(diǎn)的next=null,說(shuō)明是最后一個(gè)節(jié)點(diǎn),此時(shí)也要判斷是否要裂開(kāi)if (node.list.get(node.list.size() - 1) > num || node.next == null){node.list.add(num);//最后進(jìn)行排序下,當(dāng)然可以用插入排序解決,O(N)搞定Collections.sort(node.list);//如果該數(shù)組里面的個(gè)數(shù)大于2*blockLen,說(shuō)明已經(jīng)過(guò)大了,此時(shí)需要對(duì)半分裂if (node.list.size() > blockLen){//先將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)int mid = node.list.size()/2-1;//分裂處的前段部分ArrayList<Integer> firstList = new ArrayList<Integer>();//分裂后的后段部分ArrayList<Integer> lastList = new ArrayList<Integer>();//可以在插入點(diǎn)處分裂,也可以對(duì)半分裂(這里對(duì)半分裂)for(int i=0;i<mid;i++){firstList.add(i,node.list.get(i));}for(int i=mid;i<node.list.size()-1;i++){lastList.add(i,node.list.get(i));}//開(kāi)始分裂節(jié)點(diǎn),需要新開(kāi)辟一個(gè)新節(jié)點(diǎn)ArrayList<Integer> tlist = new ArrayList<Integer>();BlockLinkNode nNode = new BlockLinkNode(null,null,tlist);nNode.list = lastList;nNode.next = node.next;nNode.prev = node;//改變當(dāng)前節(jié)點(diǎn)的next和listnode.list = firstList;node.next = nNode;}total = total + 1;return node;}return Add(node.next, num);}}public BlockLinkNode Remove(int num){return Remove(blockLinkNode, num);}private BlockLinkNode Remove(BlockLinkNode node, int num){if (node == null){return node;}else{//第一步: 判斷刪除元素是否在該節(jié)點(diǎn)內(nèi)if (node.list.size()-1> 0 && num >= node.list.get(num) && num <= node.list.get(node.list.size() - 1)){//定義改節(jié)點(diǎn)的目的在于防止remove方法假刪除的情況發(fā)生int prevcount = node.list.size();node.list.remove(num);total = total - (prevcount - node.list.size());//下一步: 判斷是否需要合并節(jié)點(diǎn)int blockLen = (int)Math.ceil(Math.sqrt(total) / 2);//如果當(dāng)前節(jié)點(diǎn)的數(shù)組個(gè)數(shù)小于 blocklen的話,那么此時(shí)改節(jié)點(diǎn)需要和后一個(gè)節(jié)點(diǎn)進(jìn)行合并//如果該節(jié)點(diǎn)時(shí)尾節(jié)點(diǎn),則放棄合并if (node.list.size()< blockLen){if (node.next != null){node.list.addAll(node.next.list);//如果下一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)不為null,則將下下個(gè)節(jié)點(diǎn)的prev賦值if (node.next.next != null)node.next.next.prev = node;node.next = node.next.next;}else{//最后一個(gè)節(jié)點(diǎn)不需要合并,如果list=0,則直接剔除該節(jié)點(diǎn)if (node.list.size()== 0){if (node.prev != null)node.prev.next = null;node = null;}}}return node;}return Remove(node.next, num);}}public int GetCount(){int count = 0;BlockLinkNode temp = blockLinkNode;System.out.println("各節(jié)點(diǎn)數(shù)據(jù)個(gè)數(shù)為:");while (temp != null){count += temp.list.size();System.out.println(temp.list.size() + ",");temp = temp.next;}System.out.println("總共有:{0} 個(gè)元素"+count);return count;}}
總結(jié)
以上是生活随笔為你收集整理的java 块状链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。