一:引言
实现的方法 LinkList类都有 自带的 可以直接调用 ,这是为了熟悉底层代码 敲了一下基本用法 ,主要以高琪老师讲的来写
二:上码
package cn.wyj.two;
import java.awt.image.RasterFormatException;
/**自定义一个链表
* @param args
*/
public class Demo2_LinkedList<E> {
private Node first;
private Node last;
private int size = 0;
public void add(E element)//alt + shift + R 可以直接改
{
Node node = new Node(element);
if(first == null)
{
first = node;
last = node;
}
else
{
node.previous = last;
node.next = null;
//尾插法
last.next = node;
last = node;
}
this.size++;
}
//元素个数
public int size(){
return this.size;
}
//删除索引位置元素
public void remove(int index)
{
checkRange(index);
Node temp = getNode(index);
if(temp != null)
{
Node up = temp.previous;
Node down = temp.next;
if(up != null)
{
up.next = down;
}
if(down != null)
{
down.previous = up;
}
if(index == 0)
{
first = down;
}
if(index == size-1)
{
last = up;
}
}
}
//在指定位置插入元素
public void add(int index,E element)
{
checkRange(index);
Node newNode = new Node(element);
Node temp = getNode(index);
if(temp!= null)
{
if(index == 0)
{
newNode.next = first;
first.previous = newNode;
newNode.previous = null;
first = newNode;
}
if(index == size - 1)
{
temp.next = newNode;
newNode.previous = temp;
}
else{
Node up = temp.previous;
up.next = newNode;
newNode.previous = up;
temp.previous = newNode;
newNode.next = temp;
}
}
this.size++;
}
//获取索引位置的元素
//a b c d e f g
//0 1 2 3 4 5 6
public Object get(int index)
{
checkRange(index);
Node temp = getNode(index);
return temp!=null?temp.element:null;
}
public Node getNode(int index)
{
Node temp = null;
if(index <= ( size()>>1))
{
temp = first;
for( int i = 0; i < index; i++ )
{
temp = temp.next;
}
}
else
{
temp = last;
for( int j = size-1; j > index; j--)
{
//System.out.println(i);
temp = temp.previous;
}
}
return temp;
}
private void checkRange(int index)
{
if(index < 0 || index >= size)
{
throw new RasterFormatException("索引位置不合法"+index);
}
}
//重写toString()方法
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("[");
Node temp = first;
while( temp != null)
{
sb.append(temp.element+"、");
temp = temp.next;
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo2_LinkedList<String> l1 = new Demo2_LinkedList<String>();
l1.add("a");
l1.add("b");
l1.add("c");
l1.add("d");
l1.add("e");
l1.add("f");
l1.add("g");
System.out.println(l1);
System.out.println(l1.size());
Object obj = l1.get(5);
System.out.println(obj);
// l1.remove(6);
// System.out.println(l1);
l1.remove(3);
System.out.println(l1);
// l1.remove(4);
// System.out.println(l1);
l1.add(0, "王老二");
System.out.println(l1);
}
}
结点类:
package cn.wyj.two;
public class Node {
Node previous;
Node next;
Object element;
public Node() {
super();
}
public Node(Object element) {
super();
this.element = element;
}
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
}