单链表的自定义实现

1,先定义一个接口并在里面存放一些单链表的常用方法。

如下:

public interface IList {
    //头插法
    public void addFirst(int data);
    //尾插法
    public void addLast(int data);
    //任意位置插入,第一个数据节点为0号下标
    public void addIndex(int index,int data);
    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key);
    //删除第一次出现关键字为key的节点
    public void remove(int key);
    //删除所有值为key的节点
    public void removeAllKey(int key);
    //得到单链表的长度
    public int size();
    //清空单链表
    public void clear();
    //打印单链表
    public void display();
}

2,定义一个单链表类来实现IList接口并重写方法。

public class SingleLinkedList implements IList{

    @Override
    public void addFirst(int data) {}
    
    @Override
    public void addLast(int data) {}
    
    @Override
    public void addIndex(int index, int data) {}
    
    @Override
    public boolean contains(int key) {
        return false;
    }

    @Override
    public void remove(int key) {}

    @Override
    public void removeAllKey(int key) {}
    
    @Override
    public int size() {
        return usedsize;
    }

    @Override
    public void clear() {}
    
    @Override
    public void display() {}

}

3,定义成员变量和ListNode节点类

单链表是由一个个节点构成的:
单链表的自定义实现_第1张图片
因此需要在SingleLinkedList类中添加一个ListNode内部类,该类有两个成员变量:
分别是int类型的val和ListNode类型的next。同时也需要定义一个int类型的usedsize来记录节点的个数和定义ListNode类型的head来存放头节点的地址。

private int usedsize;
private LinkedNode head;
static class LinkedNode{
	private int value;
	LinkedNode next;
	public LinkedNode(int value){
		this.value = value;
	}
}

4,完成类中的一系列方法

1,得到单链表的长度
已经定义了usedsize来记录节点的个数,故usedsize的值就是单链表的长度。

public int size() {
	return usedsize;
}

2,头插法
单链表的自定义实现_第2张图片

public void addFirst(int data) {
       LinkedNodea = new LinkedNode(data);
        a.next = head;
        head = a;
        usedsize++;
    }

3,尾插法
当节点个数为零时,直接让head 指向要插入的节点。否则要想在链表的尾部插入,就必须找到最后一个节点的位置,因此需要定义cur = head,当cur不等于Null时让cur = cur.next,这样cur最后就是最后一个节点。

    public void addLast(int data) {
        LinkedNodea = new LinkedNode(data);
        if (head == null)
            head = a;
        else {
            LinkedNode cur = head;
            while (cur.next != null){
                cur = cur.next;
            }
            cur.next = a;
            usedsize++;
        }
    }

4,任意位置插入,第一个数据节点为0号下标
当index为0和usedsize时,分别调用头插法和尾插法,否则如下:
单链表的自定义实现_第3张图片

    public void addIndex(int index, int data) {
        if (index == 0)
            addFirst(data);
        else if (index == size())
            addLast(data);
        else{
            LinkedNode a = new LinkedNode(data);
            LinkedNode cur = head;
            for (int i = 0; i < index-1; i++) {
                cur = cur.next;
            }
            a.next = cur.next;
            cur.next = a;
            usedsize++;
        }
    }

5,查找是否包含关键字key是否在单链表当中
只需定义cur = head,然后遍历链表即可。

 public boolean contains(int key) {
        LinkedNode cur = head;
        while (cur != null){
            if (cur.value == key){
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

6,删除第一次出现关键字为key的节点
当key为第一个节点时,只需让head = head.next即可。否则:
单链表的自定义实现_第4张图片

 public void remove(int key) {
        if (head.value == key){
            head = head.next;
            usedsize--;
        }else {
            LinkedNode cur =head;
            while (cur.next != null){
                if (cur.next.value == key){
                    cur.next = cur.next.next;
                    usedsize--;
                    return;
                }
            }
        }
    }

7,删除所有值为key的节点
和删除一个key的操作基本相同。

public void removeAllKey(int key) {
        LinkedNode cur = head;
        while (cur.next != null){
            if (cur.next.value != key){
                cur = cur.next;
            }else {
                cur.next = cur.next.next;
                usedsize--;
            }
        }
        if (head.value == key){
            head = head.next;
            usedsize--;
        }
    }

8,清空单链表

public void clear() {
        LinkedNode cur=head;
        while(cur!=null){
            LinkedNode curNext = cur.next;
            cur.next = null;
            cur = curNext;
        }
        head = null;
    }

9,,打印单链表

public void display() {
        LinkedNode cur = head;
        for (int i = 0; i < size(); i++) {
            System.out.print(cur.value + " ");
            cur = cur.next;
        }
        System.out.println();
    }

5 ,完整代码

public class SingleLinkedList implements IList {

    private int usedsize;
    static class LinkedNode {
        private int value;
        LinkedNode next;
        public LinkedNode(int value) {
            this.value = value;
        }
    }

    private LinkedNode head;

    @Override
    public void addFirst(int data) {
        LinkedNode a = new LinkedNode(data);
        a.next = head;
        head = a;
        usedsize++;
    }

    @Override
    public void addLast(int data) {
        LinkedNode a = new LinkedNode(data);
        if (head == null)
            head = a;
        else {
            LinkedNode cur = head;
            while (cur.next != null) {
                cur = cur.next;
            }
            cur.next = a;
            usedsize++;
        }

    }

    @Override
    public void addIndex(int index, int data) {
        if (index == 0)
            addFirst(data);
        else if (index == size())
            addLast(data);
        else {
            LinkedNode a = new LinkedNode(data);
            LinkedNode cur = head;
            for (int i = 0; i < index - 1; i++) {
                cur = cur.next;
            }
            a.next = cur.next;
            cur.next = a;
            usedsize++;
        }
    }

    @Override
    public boolean contains(int key) {
        LinkedNode cur = head;
        while (cur != null){
            if (cur.value == key){
                return true;
            }
            cur = cur.next;
        }
        return false;
    }
    @Override
    public void remove(int key) {
        if (head.value == key){
            head = head.next;
            usedsize--;
        }else {
            LinkedNode cur =head;
            while (cur.next != null){
                if (cur.next.value == key){
                    cur.next = cur.next.next;
                    usedsize--;
                    return;
                }
            }
        }
    }

    @Override
    public void removeAllKey(int key) {
        LinkedNode cur = head;
        while (cur.next != null){
            if (cur.next.value != key){
                cur = cur.next;
            }else {
                cur.next = cur.next.next;
                usedsize--;
            }
        }
        if (head.value == key){
            head = head.next;
            usedsize--;
        }
    }

    @Override
    public int size() {
        return usedsize;
    }

    @Override
    public void clear() {
        LinkedNode cur=head;
        while(cur!=null){
            LinkedNode curNext = cur.next;
            cur.next = null;
            cur = curNext;
        }
        head = null;
    }

    @Override
    public void display() {
        LinkedNode cur = head;
        for (int i = 0; i < size(); i++) {
            System.out.print(cur.value + " ");
            cur = cur.next;
        }
        System.out.println();
    }
}

你可能感兴趣的:(java,数据结构)