链表: 末尾添加元素, 插入元素, 获得指定位置的元素, 删除指定位置元素
数组和链表的优劣
1.数组的物理空间连续, 碎片化空间使用不彻底
链表物理空间不连续, 空间使用彻底
2.链表只能从head开始访问, 访问效率低
数组可以随机访问任意元素, 访问效率高
3.链表插入/移除元素, 只需要操作1~2个元素, 效率高
数组插入/移除元素, 涉及到大量元素的移动, 效率低
链表实现
代码实现
package datastructure;
public class SingleNode<T> {
private Node head = new Node(null);
public class Node {
private T data;
private Node next;
public Node(T a) {
this.data = a;
}
}
public void add(T a) {
Node node = head;
while (node.next != null) {
node = node.next;
}
node.next = new Node(a);
}
public String toString(){
Node node = head;
StringBuilder sb = new StringBuilder();
while (node.next != null) {
node = node.next;
sb.append(node.data);
}
return sb.toString();
}
public void remove(T a){
Node node = head;
while (node.next.data != a){
node = node.next;
}
node.next = node.next.next;
}
public void remove(int index){
Node node = getIndexPreNode(index);
node.next = node.next.next;
}
public void insert(T a,T b){
Node node = head;
do{
node = node.next;
}while(!node.data.equals(b));
Node insert = new Node(a);
insert.next = node.next;
node.next = insert;
}
public void insert(int index,T data){
Node node = getIndexPreNode(index);
Node in = new Node(data);
in.next = node.next;
node.next = in;
}
public Node getIndexPreNode(int index){
Node node = head;
for(int i = 0; i < index; i++){
node = node.next;
}
return node;
}
public Object getNode(int index){
return getIndexPreNode(index).next.data;
}
public void reverse(){
Node node = head.next;
while(node.next != null){
Node temp = node.next.next;
node.next.next = head.next;
head.next = node.next;
node.next = temp;
}
}
}
测试
package datastructure;
public class SingleLink {
public static void main(String[] args) {
SingleNode<String> node = new SingleNode();
node.add("我");
node.add("是");
node.add("傻");
node.add("比");
node.add("你");
node.add("帅");
System.out.println(node);
node.remove("傻");
node.remove("是");
System.out.println(node);
node.insert("多了","帅");
System.out.println(node);
node.insert(5,"傻比");
System.out.println(node);
System.out.println(node.getNode(3));
node.remove(4);
System.out.println(node);
node.reverse();
System.out.println(node);
}
}