1 /** 2 * Link节点 有数据项和next指向下一个Link引用 3 */ 4 class Link { 5 private int iData;// 数据 6 private double dData;// 数据 7 public Link next;// 下一个link节点的引用 8 9 public int getiData() { 10 return iData; 11 } 12 13 public Link(int i, double d) { 14 iData = i; 15 dData = d; 16 } 17 18 public String toString() { 19 return "[" + iData + "," + dData + "]"; 20 } 21 22 public void displayLink() { 23 System.out.println(toString()); 24 } 25 } 26 27 /** 28 * 链表类 维护一个头节点 29 */ 30 class LinkList { 31 private Link first; 32 33 /** 34 * 初始化的时候头结点置空 35 */ 36 public LinkList() { 37 first = null; 38 } 39 40 /** 41 * 头结点是空代表链表为空 42 * 43 * @return 44 */ 45 public boolean isEmpty() { 46 return first == null; 47 } 48 49 /** 50 * 向链表头插入Link节点 51 * 52 * @param link 53 */ 54 public void insertFirst(Link link) { 55 link.next = first;// 要插入的节点的next指针指向链表的头节点 56 first = link;// 链表的头结点指向被插入的节点 57 } 58 59 /** 60 * 从链表头删除头结点并返回 61 * 62 * @return 63 */ 64 public Link deleteFirst() { 65 Link temp = first;// temp临时存上头结点 66 first = first.next;// 将头节点的next指针指向下一个节点 67 return temp;// 返回temp 68 } 69 70 @Override 71 public String toString() { 72 if (isEmpty()) 73 return "{}"; 74 StringBuilder sb = new StringBuilder(); 75 sb.append("{"); 76 Link current = first; 77 while (current != null) { 78 sb.append(current.toString()); 79 sb.append(","); 80 current = current.next; 81 } 82 sb.deleteCharAt(sb.length() - 1); 83 sb.append("}"); 84 return sb.toString(); 85 } 86 87 /** 88 * 根据key寻找节点 89 * 90 * @param key 91 * @return 92 */ 93 public Link find(int key) { 94 Link curr = first; 95 while (curr.getiData() != key) { 96 if (curr.next == null) 97 return null; 98 else 99 curr = curr.next; 100 } 101 return curr; 102 } 103 104 /** 105 * 根据key值删除节点 106 * 107 * @param key 108 * @return 109 */ 110 public Link deleteByKey(int key) { 111 Link current = first; 112 Link previous = first; 113 // 根据key值遍历 114 while (current.getiData() != key) { 115 if (current.next == null)//找不到,返回null 116 return null; 117 else { 118 previous = current; 119 current = current.next; 120 } 121 } 122 //找到,此时头结点就是要删除的节点,直接把头结点置为头结点的next节点 123 if (current == first) 124 first = first.next; 125 else//找到,此时把前一个节点的next指向当前节点的next即可 126 previous.next = current.next; 127 return current; 128 } 129 130 public void displayList() { 131 System.out.println(toString()); 132 } 133 } 134 135 public class LinkListDemo { 136 public static void main(String[] args) { 137 LinkList ll = new LinkList(); 138 for (int i = 0; i < 10; i++) { 139 Link l = new Link(i, i + 11.23); 140 ll.insertFirst(l); 141 ll.displayList(); 142 } 143 ll.deleteFirst(); 144 ll.deleteFirst(); 145 ll.displayList(); 146 Link l3 = ll.find(3); 147 System.out.println("key 为3的节点是: "+l3.toString()); 148 ll.deleteByKey(3); 149 System.out.print("删除该节点后,链表是:"); 150 ll.displayList(); 151 } 152 }