生活随笔
收集整理的這篇文章主要介紹了
自定义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());}}
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;}
public int size() {
return theSize;}
public boolean
isEmpty() {
return size() ==
0;}
public Object
get(
int index) {
return getNode(index).data;}
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;}
public 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++;}
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--;}
private Node<Object>
getNode(
int index) {Node<Object> indexNode =
null;
if (index <
0 || index > size()) {
throw new IndexOutOfBoundsException();}
if (index < size() /
2) {indexNode = beginMarker.next;
for (
int i =
0; i < index; i++) {indexNode = indexNode.next;}}
else {indexNode = endMarker;
for (
int i = size(); i > index; i--) {indexNode = indexNode.prior;}}
return indexNode;}@Override
public Iterator<Object>
iterator() {
return new LinkedListIterator();}
private class LinkedListIterator implements Iterator<Object> {
private Node<Object> current = beginMarker.next;
private boolean okToRemove =
false;@Override
public boolean
hasNext() {
return current != endMarker;}@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) {
throw new IllegalStateException();}MyLinkedList.
this.remove(current.prior);okToRemove =
false;}}
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的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。