数组列表
由于数组的长度是固定的,所以为了能够做到在增删改查,我们数组创建了一个数组列表。
用数组写数组列表思路:
如果是添加一个元素,就创建一个新的数组比原来的长度大一个单位,把所有之前的元素一个个遍历到新的数组中,然后添加新的元素到最后的位置。
添加元素的实现:
public class DesignArrList implements DesignList{
int size;
Object [] arry = new Object[size];
public void add(Object value) {
//System.out.println(size+1);
// TODO Auto-generated method stub
Object [] arryplus = new Object[size+1];
for (int i = 0;i<arry.length;i++) {
arryplus[i] = arry[i];
}
arryplus[size] = value;
arry = arryplus;
size+=1;
}
删除元素的实现:
public Object remove(int index) {
int j = 0;
Object z ;
z = arry[index];
Object [] arryminus = new Object[size-1];
for (int i = 0; i<arryminus.length;i++) {
if (i==index || j == 1) {
arryminus[i] = arry[i+1];
j=1;
}
else {
arryminus[i] = arry[i];
}
}
arry = arryminus;
size-=1;
return z;
}
修改元素的实现:
public Object edit(int index, Object update) {
// TODO Auto-generated method stub
Object old = null;
for (int i = 0; i<arry.length;i++) {
if (i==index) {
old = arry[i];
arry[i]=update;
}
}
return old;
}
链表
链表有单向、双向、循环链表,各自都有不同的功能。
用节点写单链表思路:
这里描述的是单向链表,类似于每个数据都储存在单个节点中,如果要添加一个新的数据,就创建一个新的节点,然后由上一个节点的next连接新的节点。这样的好处每添加一个新的节点就只用添加一个,然后连接,并不需要像数组列表那样要再创建一个新的数组再添加到后一位。
public class Node {
public Object data;
public Node next;
public Node(Object data) {
this.data = data;
}
}
data用来储存数据,next用来指向下一个节点,一个个链接形成链表
添加元素的实现:
public void add(Object o) {
// TODO Auto-generated method stub
Node newNode = new Node(o);
//判断链表中 头节点是否有节点数据
Node head = first.next;
if (head == null) {
first = newNode;
first.next = newNode;
last = newNode;
}
else {
last.next = newNode;
last = newNode;
//System.out.println("last: "+last);
}
size++;
}
除去元素的实现:
public void remove(int index) {
Node node = first;
if (index == 0) {
first = first.next;
size-=1;
return;
}
if (index == size -1) {
int j = 0;
while (node != null && j < size - 2) {
node = node.next;
j+=1;
}
last = node;
last.next = null;
System.out.println(last.data);
size-=1;
return;
}
if (index < size -1 && index >0) {
int j = 0;
while (node != null && j < index - 1) {
node = node.next;
j+=1;
}
// System.out.println("00000: "+node.data);
node.next = node.next.next;
// System.out.println("node.next: "+node.next);
size-=1;
}
}
寻找节点方法的实现:
public void printNode(Node node) {
while (true) {
if (node != null) {
System.out.println("LinkList: "+node.data);
node = node.next;
}
else {
break;
}
}
}
演示:
public class Main {
public static void main(String []args) {
MyLinkList ls = new MyLinkList();
ls.add(1);
ls.add(2);
ls.add(3);
ls.add(4);
ls.add(5);
ls.add(6);
ls.remove(4);
ls.remove(1);
ls.printNode(ls.first);
// System.out.println("lastx: "+ls.last.data);
//System.out.println(ls.first.data);
}