结构:
private static class Node {
int item;
Node next;
Node(int item, Node next) {
this.item = item;
this.next = next;
}
}
创建:
private Node first;//头结点,不存数据
private Node last;//指向链表的最后一个节点
private int size;
public MyLinkedList() {
size = 0;
first = new Node(0, null);
last = null;
}
添加:
/**
* 添加到链表尾部
*
* @param item
*/
public void add(int item) {
/********** Begin *********/
Node node=new Node(item,null);
if(size==0){
first.next=node;
last=node;
size++;
}
else{
last.next=node;
last=node;
size++;}
/********** End *********/
}
/**
* 添加到链表头部
*
* @param item
*/
public void addhead(int item) {
/********** Begin *********/
Node node=new Node(item,null);
if(size==0){
first.next=node;
last=node;
size++;
}
else{
node.next=first.next;
first.next=node;
size++;}
/********** End *********/
}
/**
* 添加数据item到指定位置index
* index从0开始
* @param index
* @param item
*/
public void add(int index, int item) {
checkPosIndex(index);
/********** Begin *********/
Node node=new Node(item,null);
int i=0;
Node pointer=first;
if(size==0){
first.next=node;
last=node;
size++;
}else{
while(i<index&&pointer.next!=null){
pointer=pointer.next;
i++;
}
if(pointer.next!=null)
node.next=pointer.next;
else{
last=node;
}
pointer.next=node;
size++;
}
/********** End *********/
}在这里插入代码片
删除:
尤其注意头指针和尾指针和size的变化;其次是注意下标和指针对应起来;
因为睡眠不足而晕乎乎的我写了一堆乱七八糟的东西,给我自己看笑了。
/**
* 删除指定位置index处的元素并返回, index从0开始
* @param index
* @return
*/
public int remove(int index) {
checkPosIndex(index);
/********** Begin *********/
int i=-1;
int m=99999;
Node hhh=first;
while(i<index-1&&hhh.next!=null){
hhh=hhh.next;
i=i+1;
}
if(hhh.next!=null){
m= hhh.next.item;
hhh.next=hhh.next.next;
if(index==size-1){
last=hhh;//要注意last的指针移动
}
}
size--;//要注意总长度需要变化
return m;
/********** End *********/
}
查询:
/**
* 获取链表中第index个元素
* @param index
* @return
*/
public int get(int index) {
checkPosIndex(index);
/********** Begin *********/
int i=-1;
Node node=first;
while(i<index){
node=node.next;
i++;
}
return node.item;
/********** End *********/
}
防止溢出:
private void checkPosIndex(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
奇码共赏时刻: