Java链表练习~字符串型带傀儡结点的双向非循环链表

//结点类
public class ListNode {
    public String strDate;
    public ListNode prev;
    public ListNode next;
    public ListNode(String strDate) {
        this.strDate = strDate;
        this.next = null;
        this.prev = null;
    }
}
//链表实现类
public class FakeLinkListNode {
    private ListNode fakeHead;
    private ListNode last;

    public FakeLinkListNode(){
        this.fakeHead = new ListNode("0");
        this.last = null;
    }

    //头插法
  public void addFirst(String strDate) {
      ListNode elem = new ListNode(strDate);
        if(this.fakeHead.next == null) {
            this.fakeHead.next = elem;
            elem.prev = this.fakeHead;
            this.last = elem;
            return;
        }
        this.fakeHead.next.prev = elem;
        elem.next = this.fakeHead.next;
        this.fakeHead.next = elem;
        elem.prev = this.fakeHead;
  }
  //尾插法
  public void addLast(String strDate) {
      ListNode elem = new ListNode(strDate);
        if(this.fakeHead.next == null) {
            this.fakeHead.next = elem;
            elem.prev = this.fakeHead;
            this.last = elem;
            return;
        }
        elem.prev = this.last;
        this.last.next = elem;
        this.last = elem;
    }
 //任意位置插入,第一个数据节点为0号下标
 public void addIndex(int index,String strDate) {
        if(index < 0 || index > size()) {
            System.out.println("INDEX NULL ERRPE");
            return;
        }
        if(index == 0) {
            addFirst(strDate);
            return;
        }
        if(index == size()) {
            addLast(strDate);
            return;
        }
        ListNode find = findIndex(index);
        ListNode elem = new ListNode(strDate);
        elem.next = find.next;
        find.next.prev = elem;
        find.next = elem;
        elem.prev = find;
    }

    private ListNode findIndex(int inedx) {
        ListNode find = this.fakeHead.next;
        int count = 0;
        while (count < inedx - 1) {
            find = find.next;
            count ++;
        }
        return find;
    }
  //查找是否包含关键字key是否在单链表当中
  public boolean contains(String key) {
        ListNode find = this.fakeHead.next;
        while (find != null) {
            if(find.strDate.equals(key)) {
                return true;
            }
            find = find.next;
        }
        return false;
    }
  //删除第一次出现关键字为key的节点
  public void remove(String key) {
        ListNode find = this.fakeHead.next;
        while (find.next != null) {
            if(find.strDate.equals(key)) {
                find.prev.next = find.next;
                find.next.prev = find.prev;
                return;
            }
            find = find.next;
        }
        if(this.last.strDate.equals(key)) {
            this.last = this.last.prev;
            this.last.next = null;
            return;
        }
      System.out.println("NO KEY");
    }
  //删除所有值为key的节点
  public void removeAllKey(String key) {
        ListNode find = this.fakeHead.next;
        while (find.next != null) {
            if(find.strDate.equals(key)) {
                find.prev.next = find.next;
                find.next.prev = find.prev;
            }
            find = find.next;
        }
        if(this.last.strDate.equals(key)) {
            this.last = this.last.prev;
            this.last.next = null;
        }
    }
  //得到单链表的长度
  public int size() {
        ListNode find = this.fakeHead.next;
        int count = 0;
        while (find != null) {
            count ++;
            find = find.next;
        }
        return count;
    }
  public void display() {
        ListNode find = this.fakeHead.next;
        while (find != null) {
            System.out.print(find.strDate + " ");
            find = find.next;
        }
      System.out.println();
  }
  public void clear() {
        this.fakeHead.next = null;
        this.last = null;
  }
}
//测试类
public class Test {
    public static void main(String[] args) {
        FakeLinkListNode linkListNode = new FakeLinkListNode();
        linkListNode.addFirst("bbb");
        linkListNode.addFirst("aaa");
        linkListNode.addLast("ccc");
        linkListNode.addLast("ddd");
        linkListNode.addFirst("000");
        linkListNode.addIndex(0, "eee");
        linkListNode.addIndex(6, "ggg");
        linkListNode.addIndex(8, "fff");
        linkListNode.display();
        System.out.println(linkListNode.size());
        if (linkListNode.contains("000") && linkListNode.contains("ggg")) {
            System.out.println("OK");
        }
        System.out.println("=========removeFirstKey==========");
        linkListNode.display();
        linkListNode.remove("eee");
        linkListNode.remove("ggg");
        linkListNode.remove("bbb");
        linkListNode.remove("000");
        linkListNode.display();
        System.out.println("=========rremoveAllKey=========");
        linkListNode.addFirst("000");
        linkListNode.addFirst("000");
        linkListNode.addLast("000");
        linkListNode.addLast("000");
        linkListNode.addIndex(3, "000");
        linkListNode.addIndex(4, "000");
        linkListNode.addIndex(6, "000");
        linkListNode.display();
        linkListNode.removeAllKey("000");
        linkListNode.display();
        System.out.println("======clear=======");
        linkListNode.clear();
        linkListNode.display();
    }
}

运行结果:

INDEX NULL ERRPE
eee 000 aaa bbb ccc ddd ggg 
7
OK
=========removeFirstKey==========
eee 000 aaa bbb ccc ddd ggg 
aaa ccc ddd 
=========rremoveAllKey=========
000 000 aaa 000 000 ccc 000 ddd 000 000 
aaa ccc ddd 
======clear=======


Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/105254865