麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

數(shù)據(jù)結(jié)構(gòu)(五)雙鏈表

2019-11-10 20:26:04
字體:
供稿:網(wǎng)友

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。

java模擬雙鏈表結(jié)構(gòu).實現(xiàn)增刪改查等方法.

/** * 雙鏈表 */public class MyDoubleLink<T> implements Iterable<T>{ /** *節(jié)點的封裝類 */ PRivate class Node{ Node prev;//上一個節(jié)點 T data;//數(shù)據(jù) Node next;//下一個節(jié)點 } private Node head;//頭節(jié)點 private Node rear;//尾節(jié)點 /** * 添加數(shù)據(jù) * @param data */ public void add(T data){ //1.創(chuàng)建新的節(jié)點 Node node = new Node(); //2.把數(shù)據(jù)放入節(jié)點中 node.data = data; //3.把節(jié)點鏈接到鏈表中 //從鏈表的尾部添加數(shù)據(jù) if (rear == null) { //說明鏈表是空,當(dāng)前節(jié)點就成為頭節(jié)點 rear = node; head = node; }else { //有頭節(jié)點 rear.next = node; node.prev = rear; rear = node; } } /** * 重寫toString方法 */ public String toString(){ StringBuffer sb = new StringBuffer("["); //遍歷鏈表中的所有數(shù)據(jù) Node node = head;//從頭節(jié)點開始遍歷數(shù)據(jù) while (node != null) { //有數(shù)據(jù) //拼接數(shù)據(jù) //判斷是否是尾節(jié)點 if (node != rear) { sb.append(node.data+", "); }else { sb.append(node.data); } //條件的改變 node = node.next; } sb.append("]"); return sb.toString(); } /** * 刪除數(shù)據(jù) * 1.只有一個數(shù)據(jù) * 2.刪除頭節(jié)點 * 3.刪除數(shù)據(jù) * 4.刪除尾節(jié)點 * @param data */ public void remove(T data){ //1.查找數(shù)據(jù)是否存在,查找數(shù)據(jù)所在的節(jié)點 Node node = findData(data); //2.判斷node是否存在 if (node != null) { //存在 remove(node); } } /** * 刪除節(jié)點 * @param node */ public void remove(Node node){ if (node == head && node == rear) { //1.只有一個數(shù)據(jù) head = null; rear = null; }else if (node == head) { //2.刪除頭節(jié)點,后面肯定有節(jié)點 head = head.next; head.prev = null; }else if (node == rear) { //3.刪除尾節(jié)點,前面肯定有節(jié)點 rear = rear.prev; rear.next = null; }else { //4.刪除數(shù)據(jù),前后肯定有節(jié)點 node.prev.next = node.next; node.next.prev = node.prev; } } /** * 查找數(shù)據(jù)所在節(jié)點 * @param data * @return */ private Node findData(T data) { Node node = head; while (node != null) { if (node.data.equals(data) && node.data.hashCode() == data.hashCode()) { //找到數(shù)據(jù) break; }else { //繼續(xù)下一個 node = node.next; } } return node; } /** * 修改數(shù)據(jù) * @param oldData * @param newData */ public void updata(T oldData,T newData){ Node node = findData(oldData); if (node != null) { node.data = newData; } } /** * 修改數(shù)據(jù)(在對象的hash值相同的情況下修改對象屬性值) * @param data */ public void updata(T data){ Node node = findData(data); if (node != null) { node.data = data; } } /** * 是否包含數(shù)據(jù) * @param data * @return */ public boolean contains(T data){ return findData(data) != null; } /** * 重寫迭代器方法,可以用增強for */ @Override public Iterator iterator() { class MyIte implements Iterator{ private Node node = head;//從頭節(jié)點遍歷 @Override public boolean hasNext() { return node != null; } @Override public Object next() { Object data = node.data;//獲取數(shù)據(jù) node = node.next;//設(shè)置下一個數(shù)據(jù) return data; } @Override public void remove() { //刪除next方法返回的數(shù)據(jù) MyDoubleLink.this.remove(node.prev); } } return new MyIte(); } /** * 從頭部添加數(shù)據(jù) * @param data */ public void addFirst(T data){ //1.創(chuàng)建新的節(jié)點 Node node = new Node(); //2.把數(shù)據(jù)放入節(jié)點中 node.data = data; //3.把節(jié)點鏈接到鏈表中 //從鏈表的尾部添加數(shù)據(jù) if (rear == null) { //說明鏈表是空,當(dāng)前節(jié)點就成為頭節(jié)點 rear = node; head = node; }else { //有頭節(jié)點 head.prev = node; node.next = head; head = node; } } /** * 排序添加數(shù)據(jù),添加數(shù)據(jù)時自動排序 * @param data */ public void addSort(T data){ addSortBlock(data,null); } /** * 查找比data大的第一個節(jié)點 * @param data * @return */ private Node findNext(T data){ //從頭節(jié)點開始找 Node node = head; while (node != null) { //比較 if (compare(node.data, data)>0) { break; }else { //繼續(xù)找下一個 node = node.next; } } return node; } /** * 查找比data大的第一個節(jié)點(使用比較器) * @param data * @param comp 比較器 * @return */ private Node findNext(T data,Comparator<T> comp){ //從頭節(jié)點開始找 Node node = head; while (node != null) { //比較 if (comp.compare(node.data, data)>0) { break; }else { //繼續(xù)找下一個 node = node.next; } } return node; } /** * 比較兩個數(shù)據(jù)的大小 * @param obj1 * @param obj2 * @return * 0 相等 * 大于0 obj1 > obj2 * 小于0 obj1 < obj2 */ public int compare(T obj1,T obj2){ Comparable c1; Comparable c2; if (obj1 instanceof Comparable) { //數(shù)據(jù)實現(xiàn)比較器 c1 = (Comparable)obj1; c2 = (Comparable)obj2; }else { //沒有實現(xiàn)比較器 c1 = obj1.toString(); c2 = obj2.toString(); } return c1.compareTo(c2); } /** * 添加數(shù)據(jù)并進(jìn)行排序(使用比較器) * @param data * @param comparable 比較器 */ public void addSort(T data,Comparator<T> comparable){ addSortBlock(data,comparable); } /** * 添加數(shù)據(jù)并進(jìn)行排序(私有方法) * @param data 傳入數(shù)據(jù) * @param comp 比較器 */ private void addSortBlock(T data,Comparator<T> comp){ //1.創(chuàng)建新的節(jié)點 Node node = new Node(); //2.把數(shù)據(jù)放入節(jié)點中 node.data = data; Node next = null; //2.找位置(從小到大)添加數(shù)據(jù) if (comp != null) { next= findNext(data,comp); }else { next = findNext(data); } if (next != null) { //找到下一個節(jié)點,把data放到next節(jié)點前 if (next == head) { addFirst(data); }else { next.prev.next = node; node.next = next; node.prev = next.prev; next.prev = node; } }else { //沒找到下一個節(jié)點,data最大 add(data); } }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久精品视频在线 | 神秘电影91 | 免费一级毛片在线播放不收费 | 国产在线欧美日韩 | 欧美 日韩 国产 成人 | 91精品国产777在线观看 | 久久亚色| 日产精品久久久一区二区开放时间 | 日韩精品久久久久久 | 一区二区国产在线 | 伊久在线 | 国产精品一区二区x88av | 全黄毛片 | 国产一区二区视频观看 | 污片视频网站 | 久久国产乱子伦精品 | 欧美性受ⅹ╳╳╳黑人a性爽 | 欧美一级片一区 | 青青青在线免费 | 久久精品一二三区 | 国产在线一级视频 | 免费视频aaa| 亚洲网站一区 | 久久精品欧美视频 | 精品久久中文字幕 | 日韩一级精品 | 中文日韩欧美 | 欧洲黄视频 | 国产一区二区三区四区五区加勒比 | 日韩av电影免费看 | 国产三级精品最新在线 | 成人福利视频网站 | 羞羞网站在线观看入口免费 | 黄色淫片| 在线日韩av电影 | 最新中文在线视频 | 国产精品久久久久久久久久电影 | 色综合久久久久久久久久久 | 最近日本电影hd免费观看 | 蜜桃91丨九色丨蝌蚪91桃色 | 久久精品中文 |