链表与动态数组的实现方式差不多, 数组适合快速删除某个元素 链表则可以快速的保存数组并且可以是不连续的
单项链表;数据从第一个指向最后一个
实现代码:
//定义动态链表 class Node<E>{ E e;//定义的节点 Node next;//节点的下一个 Node front ;//节点的前一个 public Node(E e){ this.e =(E)e; } public String toString(){ return (String)e; } } //创建单项链表类 public class LinkedList{ public static void main(String[] args) { LinkedList list = new LinkedList(); Node node=list.creatNode(); list.printlist(node); } public Node<String> creatNode(){ Node<String> node = new Node<String>("节点一"); Node<String> node2 = new Node<String>("节点二"); Node<String> node3 = new Node<String>("节点三"); Node<String> node4 = new Node<String>("节点四"); node.next = node2; node2.next = node3; node3.next = node4; node4.front = node3; node3.front = node2; node2.front = node; return node; } public void printlist(Node node){ while(node!=null){ System.out.println(node); node = node.next; } } }
运行结果:
节点一
节点二
节点三
节点四
双向链表:可以指定前面节点也可以指向后面数据的节点
实现链表的增删改查 等方法
/** * 节点类 * * @author kowloon * */ public class Node<E> { E e;// 节点中的元素 Node<E> front;// 对前一个节点的引用 Node<E> next;// 对下一个节点的引用 public Node(E e) { this.e = e; } @Override public String toString() { return (String) e; } }
节点的方法
package trr0717链表; public class LinkedList1 { Node head = null; Node foot = null; int count = 0; public Node getHead() { return head; } // 直接在后面增加节点 public void add(String s) { Node node = new Node(s); if (head == null) {// 当没有头节点的时候 head = node; foot = node; } else {// 双链表 foot.next = node; node.front = foot; } foot = node; count++; } // 直接在后面增加节点 public void add(int index, String s) { if (index < 0 || index >= size()) {// 若数组越界就抛出异常 throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个数组" + index); } Node nodenew = new Node(s); Node node = getNode(index); if (index == 0) {// 若是o下标 node.front = nodenew; nodenew.next = node; head = nodenew; /* System.out.println(head+"<><><><"); */ } else { Node frontnode = node.front; Node nextnode = node.next; frontnode.next = nodenew; nodenew.next = nextnode; nodenew.front = frontnode; nextnode.front = nodenew; } count++; } // 移除指定位置的节点 public void remove(int index) { if (index < 0 || index >= size()) {// 若数组越界就抛出异常 throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个数组" + index); } if (index == 0) { Node n = head.next;// 先要接触引用关系 head.next = null; n.front = null; head = n; } else { Node node = getNode(index);// 得到指定位置上下一个节点 Node fnode = node.front; Node nextnode = node.next; fnode.next = nextnode;// 把指定位置的下一个节点给他上一个节点 nextnode.front = fnode; } count--; } // 移除指定内容的节点 public void remove(String s) { Node node = head; for (int i = 0; i < size(); i++) { if (node.e.equals(s)) {// 若相等 remove(i); break; } node = node.next; } } // 修改指定地点的节点内容 public void set(int index, String s) { Node n = getNode(index); n.e = s; } // 取得某个节点对象 public Node getNode(int index) { if (index < 0 || index >= size()) {// 若数组越界就抛出异常 throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个下标" + index); } int i = 0; Node node = head;// 把head也放到队列里面 while (i < index) { i++; node = node.next; } /* System.out.println("第"+i+"个节点:"+node); */ return node; } // 链表的大小 public int size() { System.out.println("数组个数:" + count); return count; } // 遍历链表的方法 public static void linkedVist(Node head) { if (head != null) { System.out.println(head); Node node = head.next; linkedVist(node); } } }