public class SingleLinkedList{
//准备工作
static class ListNode {
public int val;
public ListNode prev;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public ListNode head;
public ListNode last;
//这样更容易帮助我们理解链表的结构
//1.头插法
public void addFirst(int data) { ListNode node = new ListNode(data); if(head == null) { head = node; last = node; }else { node.next = head; head = node; } }
//2.尾插法
public void addLast(int data) { ListNode node = new ListNode(data); if(head == null) { head = node; last = node; }else { last.next = node; last = node; } }
//3. 任意位置插入,第一个数据节点为0号下标
public void addIndex(int index, int data) { ListNode node = new ListNode(data); ListNode cur; cur = head; int count = 0; if(head == null) { head = node; last = node; }else { while (cur.val != index) { cur = cur.next; count++; } node.next = cur.next; cur.next = node; } }
//4.查找是否包含关键字key是否在单链表当中
public boolean contains(int key) { ListNode node = new ListNode(key); ListNode cur; cur = head; while(cur != null) { if(cur == node) { return true; } cur = cur.next; } return false; }
//5.删除第一次出现关键字为key的节点
public void remove(int key) { ListNode cur = head; while(cur.next.val != key) { //找删除节点的前驱 cur = cur.next; } ListNode del = cur.next; if(cur.next == null) { System.out.println("不包含删除元素!"); }else { cur.next = del.next; } }
//6. 删除所有值为key的节点
public void removeAllKey(int key) { ListNode prev = head; ListNode cur = head.next; while(cur != null) { //遍历整个链表 if(cur.val == key) { prev.next = cur.next; cur = cur.next; }else { prev = cur; cur = cur.next; } } }
//7.得到单列表的长度
public int size() { int count = 0; ListNode cur = head; while(cur != null) { cur = cur.next; count++; } return count; }
//8. 清除整个链表
public void clear() { head = null; }
//9.打印链表
public void display() { ListNode cur = head; while(cur != null) { System.out.print(cur.val+" "); cur = cur.next; } System.out.println(); }