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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

自定义LinkedList

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义LinkedList 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LinkedList是通過雙向鏈表實現的。

下面實現LinkedList類的以下方法:

  • clear():清空整個鏈表
  • size():獲取鏈表的大小
  • isEmpty():判斷鏈表是否為空
  • get(int index):獲取鏈表在某個索引處的節點中的數據
  • set(int index,Object data):設置鏈表中在index索引處的節點中的數據,并返回該索引之前的節點中的數據
  • add(Object data):往鏈表中添加節點元素(其實新添加的節點都是尾節點,尾插法)
  • remove(int index):刪除鏈表中該索引出的節點,并返回該索引之前的節點中的數據
  • 實現LinkedList的迭代器(Iterator),實現hasnext()、next()、remove()方法,這里remove()方法必須在調用了next()方法之后才能調用
  • package com.test.test;import java.util.Iterator; import java.util.NoSuchElementException;public class Test3 {public static void main(String[] args) {MyLinkedList<String> mList = new MyLinkedList<String>();mList.add("純");mList.add("牛");mList.add("奶");System.out.println(mList.isEmpty());System.out.println(mList.size());mList.set(1, "酸");for (int i = 0; i < mList.size(); i++) {String data = mList.get(i);System.out.println(data);}Iterator iterator = mList.iterator();while(iterator.hasNext()){String data = (String) iterator.next();iterator.remove();System.out.println(data);}System.out.println(mList.size());mList.clear();System.out.println(mList.isEmpty());System.out.println(mList.size());}}/*** 自定義的LinkedList類 2015年10月20日 下午8:57:58* * @author 張耀暉** @param <Object>*/ class MyLinkedList<Object> implements Iterable<Object> {private int theSize;// 鏈表的大小private Node<Object> beginMarker;// 頭節點private Node<Object> endMarker;// 尾節點public MyLinkedList() {clear();}// 清空鏈表public void clear() {beginMarker = new Node(null, null, null);// 初始化頭節點endMarker = new Node(null, beginMarker, null);// 初始化尾節點beginMarker.next = endMarker;// 設置頭節點的后繼節點為尾節點theSize = 0;// 鏈表大小設為0}// 獲取鏈表的大小public int size() {return theSize;}// 判斷鏈表是否為空public boolean isEmpty() {return size() == 0;}// 獲取鏈表中index位置處的數據public Object get(int index) {return getNode(index).data;}// 修改鏈表中index位置處的節點的數據,返回該位置原先的節點的數據public Object set(int index, Object data) {Node<Object> indexNode = getNode(index);// 得到該位置的原先的節點Object indexData = indexNode.data;// 得到該位置原先節點的數據indexNode.data = data;// 修改該位置出的節點的數據return indexData;}// 向鏈表中的最后的位置添加數據public boolean add(Object data) {add(size(), data);return true;}// 向鏈表的index位置添加數據datapublic void add(int index, Object data) {Node<Object> indexNode = getNode(index);// 得到該位置的原先的節點Node<Object> newNode = new Node(data, indexNode.prior, indexNode);// 構造新的節點,并設置該節點的前驅節點為原先節點的前驅節點,后繼節點為原先的節點newNode.prior.next = newNode;// 修改原先節點的后繼節點為新節點indexNode.prior = newNode;// 原先節點的前驅節點為新節點theSize++;// 鏈表大小加1}// 刪除鏈表index位置處的數據,返回刪除位置節點的數據public Object remove(int index) {Node<Object> indexNode = getNode(index);// 得到該位置的原先的節點remove(indexNode);return indexNode.data;}// 刪除鏈表中的該節點private void remove(Node<Object> indexNode) {indexNode.prior.next = indexNode.next;// 設置原先節點的前驅節點的后繼節點為原先節點的后繼節點indexNode.next.prior = indexNode.prior;// 設置原先節點的后繼節點的前驅節點為原先節點的前驅節點theSize--;// 鏈表的大小減1}// 返回給定位置處的節點元素private Node<Object> getNode(int index) {Node<Object> indexNode = null;if (index < 0 || index > size()) { // 判斷輸入的index索引是否合法throw new IndexOutOfBoundsException();}if (index < size() / 2) {// 判斷index在整個鏈表的前半部分indexNode = beginMarker.next;// 假設indexNode為鏈表的第一個節點for (int i = 0; i < index; i++) {// 依次根據next找到index索引處的節點indexNode = indexNode.next;}} else {// 判斷index在整個鏈表的后半部分indexNode = endMarker;// 假設indexNode為鏈表的尾節點for (int i = size(); i > index; i--) {// 依次根據prior找到index索引出的節點indexNode = indexNode.prior;}}return indexNode;}@Overridepublic Iterator<Object> iterator() {return new LinkedListIterator();}private class LinkedListIterator implements Iterator<Object> {private Node<Object> current = beginMarker.next;// 初始化current為鏈表的第一個節點private boolean okToRemove = false;// 是否可以使用remove()方法的標志@Override// 判斷是否存在下一個節點public boolean hasNext() {return current != endMarker;// 只要current不是尾節點,說明current之后還存在下一個節點}@Override// 返回下一個節點中的數據public Object next() {if (!hasNext()) {throw new NoSuchElementException();}Object data = current.data;current = current.next;okToRemove = true;return data;}@Override// 刪除節點public void remove() {if (!okToRemove) {// 作用是使得remove方法只能在next()使用之后調用throw new IllegalStateException();}MyLinkedList.this.remove(current.prior);// 刪除當前節點的前驅節點,也就是剛才通過next()返回的節點okToRemove = false;}}/** Node(節點類)*/private class Node<Object> {public Object data;public Node<Object> prior;public Node<Object> next;public Node(Object data, Node<Object> prior, Node<Object> next) {this.data = data;this.prior = prior;this.next = next;}}}

    打印結果:

    總結

    以上是生活随笔為你收集整理的自定义LinkedList的全部內容,希望文章能夠幫你解決所遇到的問題。

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