单向链表

单向链表

由于单向链表的head节点不能找到前一个节点,对于添加和删除节点时候对于首部的操作会不一样,因此将head节点改为dummyHead,一个虚拟的头结点。便于进行操作的统一。

链表的成员变量及初始化

class LinkedList<E> {

    private Node dummyHead;//链表虚拟头节点
    private int size;//节点个数
    //内部类
    private class Node{
        public E e;
        public  Node next;//引用
        public Node(E e,Node next){
            this.e = e;
            this.next = next;
        }
        public Node(E e){
            this.e=e;
            this.next=null;
        }
        public Node(){
            this.e=null;
            this.next=null;
        }
    }
    public LinkedList(){
        dummyHead=new Node(null,null);
        size=0;
    }
}

查找:

获取链表节点个数

public int getSize(){

    return size;
}
是否为空
public boolean isEmpty(){
return size ==0;
}
是否有某元素
public boolean contains(E e){
Node current = dummyHead.next;
while (current!=null){
if(current.e.equals(e)){
return true;
}
current=current.next;
}
return false;
}
获得index位置的元素
public E get(int index){
if(index<0||index>size){
throw new IllegalArgumentException("参数不合法");
}
Node current = dummyHead.next;
for (int i=0;i<index;i++){
current = current.next;
}
return current.e;
}
获得链表头元素
public E getFirst(int index){
return get(0);
}
获得链表尾部元素
public E getLast(int index0){
return get(size-1);
}
toString()方法
public String toString(){
StringBuffer sb = new StringBuffer();
Node current = dummyHead.next;
while (current!=null){
sb.append(current.e+"->");
current=current.next;
}
sb.append("null");
return sb.toString();
}

修改:

修改index位置元素
public void set(int index,E e){
if(index<0||index>size){
throw new IllegalArgumentException("参数不合法");
}
Node current = dummyHead.next;
for(int i=0;i<index;i++){
current=current.next;
}
current.e=e;
}添加:
在链表的index的位置添加元素  
关键:找到要添加的位置的前一个节点pre,然后要添加的节点node.next指向pre.next,pre.next指向node.
public void add(int index,E e){
if(index<0||index>size){
throw new IllegalArgumentException("参数不合法");
}
Node pre = dummyHead;
for(int i=0;i<index;i++){
pre = pre.next;
}
/*Node node=new Node(e);
node.next = pre.next;
pre.next=node;*/
pre.next=new Node(e,pre.next);
size++;

}
链表头添加元素
public void addFirst(E e){
add(0,e);
}
在链表末尾添加
public void addLast(E e ){
add(size,e);
}

删除:

删除index位置元素
public E remove(int index){
if(index<0||index>size){
throw new IllegalArgumentException("参数不合法");
}
Node pre = dummyHead;
for(int i=0;i<index;i++){
pre = pre.next;
}
Node delNode = pre.next;
pre.next = delNode.next;
delNode.next=null;
size--;
return delNode.e;

}
删除首部
public E removeFirst(){
return remove(0);
}
删除尾部
public E removeLast(){
return remove(size-1);
}

gitHub源码:单向链表

posted @ 2018-12-13 15:48  发包哥哥  阅读(187)  评论(0)    收藏  举报