package com.datastructure.singlylinklist; /** * 实现一个单链表 * 实现功能: * 增加一个节点(头插法,尾插法) * 删除一个节点(删除第一个节点,删除最后一个节点,删除任何一个节点) * 查找(查找到一个list中的某个元素) * @author Xinyuyu * */ public class SinglyLinkList <T> { /* * 实现一个节点的数据结构 * 数据域 * 指针域 */ // header指向list的头 // tail指向list的尾 private IntSLLNode header; private IntSLLNode tail; class IntSLLNode{ public Object data; public IntSLLNode next; // public IntSLLNode(Object data){ this(data, null); } public IntSLLNode(Object data, IntSLLNode next){ this.data = data; this.next = next; } } public SinglyLinkList(){ header = tail = null; } // 头插法增加一个节点 public void addToHeader(Object o){ // 链表不为空的情况 // 链表为空的情况 header = new IntSLLNode(o, header); if(tail == null) tail = header; } // 尾插法增加一个节点 public void addToTail(Object o){ // 链表不为空的情况 // 链表为空的情况 IntSLLNode newNode = new IntSLLNode(o); if(!isEmpty()){ tail.next = newNode; tail = newNode; }else tail = header = newNode; } // 删除第一个节点 public Object deleteFromHeader() throws Exception{ // 链表不为空切大于一个节点 // 链表仅有一个节点 // 链表为空 IntSLLNode node = header; if(!isEmpty()){ header = header.next; }else if(!isEmpty() && header == tail){ tail = header = null; }else{ // 链表为空抛出异常 throw new Exception("SSL is empty"); } return node.data; } // 删除最后一个节点 public Object delteFromTail() throws Exception{ // 链表不是空且大于一个节点的时候 // 链表仅有一个节点的时候 // 链表是空的情况 IntSLLNode node = tail; if(!isEmpty() && header != tail){ // 一个临时指针,指向头节点,遍历到倒数第二个节点出,将尾指针指向倒数第二个节点 IntSLLNode temp = header; for(; temp.next != tail;){ temp = temp.next; } tail = temp; temp.next = null; }else if(!isEmpty() && header == tail){ tail = header = null; }else{ // 当列表为空的时候抛出异常 throw new Exception("SSL is empty"); } return node.data; } // 删除链表中的某个节点 public Object delete(Object o) throws Exception{ // 链表不为空且包含大于一个节点 // 链表仅包含一个节点 // 链表为空的情况 // 删除的为第一个节点 if(o.equals(header.data)){ return deleteFromHeader(); // 删除的为最后一个节点 }else if(o.equals(tail.data)){ return delteFromTail(); }else{ IntSLLNode temp = header; if(!isEmpty() && header != tail){ for(; !temp.next.data.equals(o);){ temp = temp.next; } if(temp != null){ temp.next = temp.next.next; temp = temp.next; } }else if(!isEmpty() && header == tail){ if(header.equals(o)){ temp = header; header = tail = null; } }else{ throw new Exception("SSL is empty"); } return temp.data; } // 如果查找到就返回一个节点信息 // 查找不到 } // 删除节点的另外一个写法(需要两个指针) public Object deletePro(Object o) throws Exception{ // 链表不为空且大于一个节点 // 链表仅包含一个节点 // 链表为空 IntSLLNode node = null; if(header.data.equals(o)){ return deleteFromHeader(); } if(!isEmpty() && header != tail){ IntSLLNode pre = header, las = header.next; for(; las != null && !las.data.equals(o); ){ pre = pre.next; las = las.next; } if(las != null) pre.next = las.next; else return delteFromTail(); node = las; }else if(!isEmpty() && header == tail){ if(header.equals(o)); tail = header = null; }else{ throw new Exception("SSL is empty"); } return node.data; } // 查找链表中的某个节点 public Object find(Object o) throws Exception{ // 链表为空 // 链表不为空 IntSLLNode temp = null; if(!isEmpty()){ temp = header; for(; temp != null && !temp.data.equals(o); ){ temp = temp.next; } if(temp == null) return null; else return temp.data; }else{ // 当链表为空的时候也就是不会查找到需要的节点 throw new Exception("The object is not exist in the SLL"); } } // 判断链表是否为空 public boolean isEmpty(){ return header == null; } // 打印出链表 public void printSinglyLinkList(String name){ System.out.print(name + " : "); for(IntSLLNode tempNode = header; tempNode != null; tempNode = tempNode.next){ System.out.print(tempNode.data.toString() + "->"); } } // 清空列表 public void emptySLL(){ header = tail = null; } }
package SinglyLinkList; public class Persion { private String name; private int age; public Persion(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "[" + this.name + " age is " + this.age + "]"; } // 需要重写equal方法来完成删除和查找 @Override public boolean equals(Object o) { if(this.name.equals(((Persion) o).getName()) && this.age == ((Persion) o).getAge()) return true; else return false; } }
package SinglyLinkList; import com.datastructure.singlylinklist.SinglyLinkList; public class TestOfSinglyList { public static void main(String[] args) { SinglyLinkList<Persion> singlyLinkList = new SinglyLinkList<Persion>(); Persion p1 = new Persion("张三", 34); Persion p2 = new Persion("李四", 24); Persion p3 = new Persion("王五", 44); Persion p4 = new Persion("李以", 44); Persion p5 = new Persion("王七", 44); // 完成头插法 singlyLinkList.addToHeader(p1); singlyLinkList.addToHeader(p2); singlyLinkList.addToHeader(p3); singlyLinkList.addToHeader(p4); singlyLinkList.addToHeader(p5); singlyLinkList.printSinglyLinkList("完成头插法"); System.out.println(); // System.out.println(); // // 清空链表 // singlyLinkList.emptySLL(); // // 完成尾插法 // singlyLinkList.addToTail(p1); // singlyLinkList.addToTail(p2); // singlyLinkList.addToTail(p3); // singlyLinkList.printSinglyLinkList("完成头插法"); // System.out.println(); // // 完成删除尾节点 // try { // Persion p = (Persion)singlyLinkList.delteFromTail(); // singlyLinkList.printSinglyLinkList("删除了最后一个节点"); // System.out.println(); // System.out.println("被删除的尾节点是 :" + p.getName() + " age is " + p.getAge()); // } catch (Exception e) { // e.printStackTrace(); // } // // 完成删除头节点 // try { // Persion p = (Persion)singlyLinkList.deleteFromHeader(); // singlyLinkList.printSinglyLinkList("删除了第一个节点"); // System.out.println(); // System.out.println("被删除的头节点是 :" + p.getName() + " age is " + p.getAge()); // } catch (Exception e) { // e.printStackTrace(); // } // 删除任意一个节点 //Persion p = new Persion("张三", 34); try { singlyLinkList.deletePro(p5); singlyLinkList.deletePro(p4); singlyLinkList.deletePro(p3); singlyLinkList.deletePro(p2); singlyLinkList.deletePro(p1); } catch (Exception e) { e.printStackTrace(); } singlyLinkList.printSinglyLinkList("任意删除一个节点"); System.out.println(); try { System.out.println(singlyLinkList.find(p1)); } catch (Exception e) { e.printStackTrace(); } } }