/** * 單向鏈表 * */public class NodeList<E> { PRivate static class Node<E> { // 節(jié)點類 E data; // 節(jié)點上的數(shù)據(jù) Node<E> next; // 指向下一個節(jié)點 Node(E e) { this.data = e; this.next = null; } } private Node<E> head; // 鏈表的頭節(jié)點 private Node<E> last; // 鏈表的尾節(jié)點 private Node<E> other = null; private int length = 0; // 節(jié)點數(shù)量 /** * 無參構(gòu)造方法 */ public NodeList() { // 默認節(jié)點為空 this.head = new Node<E>(null); } /** * 初始化時創(chuàng)建一個節(jié)點 * * @param data * 數(shù)據(jù) */ public NodeList(E data) { this.head = new Node<E>(data); this.last = head; length++; } /** * 添加一個節(jié)點(尾插法) * * @param data * 數(shù)據(jù) */ public void add(E data) { if (isEmpty()) { head = new Node<E>(data); last = head; length++; } else { Node<E> newNode = new Node<E>(data); last.next = newNode; last = newNode; } } /** * 獲得索引處的數(shù)據(jù)(索引輸入錯誤拋出越界異常) * @param index 索引 * @return 索引處數(shù)據(jù) */ public E get(int index){ if(index<0 || index>length){ throw new IndexOutOfBoundsException("索引越界:"+index); } other = head; for(int i=0;i<index;i++){ other = other.next; } return other.data; } /** * 新值替換舊值 * @return 成功為true,未找到為false */ public boolean set(E oldValue,E newValue){ other = head; while(other!=null){ if(other.data.equals(oldValue)){ other.data = newValue; return true; } other = other.next; } return false; } /** * 在指定元素后插入一個元素 * * @param data * 指定的元素 * @param insertData * 需要插入的元素 * @return false為未找到元素,true為插入成功 */ public boolean add(E data, E insertData) { other = head; while (other != null) { if (other.data.equals(data)) { Node<E> newNode = new Node<E>(insertData); Node<E> temp = other.next; newNode.next = temp; other.next = newNode; length++; return true; } other = other.next; } return false; } /** * 鏈表中是否包含此元素 * @return 包含為true,不包含為false */ public boolean contains(E data){ other = head; while(other!=null){ if(other.data.equals(data)){ return true; } other = other.next; } return false; } /** * 移除指定的元素 * @param data 需要移除的元素 * @return 不存在為false,成功為true */ public boolean remove(E data){ other = head; Node<E> temp = head; //臨時變量,用于保存前一個節(jié)點 while(other!=null){ if(other.data.equals(data)){ temp.next = other.next; length--; return true; } temp = other; other = other.next; } return false; } /** * 判斷鏈表是否為空 * * @return 空為true,非空為false */ public boolean isEmpty() { return length == 0; } /** * 清空鏈表 */ public void clear() { this.head = null; this.length = 0; } /** * 輸出所有節(jié)點 */ public void printLink() { if(isEmpty()){ System.out.println("空鏈表"); }else{ other = head; while (other != null) { System.out.print(other.data); other = other.next; } System.out.println(); } }}
新聞熱點
疑難解答