链表
元素的存储空间是离散的,单独的(物理),它们可以通过在逻辑上指针的联系使得它成为了整体的链表。
每个元素包含数据域和指针域。
单链表
单链表相对简单,由首节点到尾节点只有一个方向。如下图:
接下来我们实现一个简单的单链表,首先定义一个节点类:
/**
* 元素节点对象
* @author admin
*
*/
public class Node {
/**
* 存放数据
*/
public Object data;
/**
* 存放下一个节点信息
*/
Node next;
public Node(Object data) {
this.data = data;
}
}
再实现以个链表类结构,简单处理插入、删除、修改、查询操作:
/**
* 单向链表
* @author admin
*
*/
public class MyLinkedList {
//头结点
private Node head;
//尾节点
private Node last;
//长度
private int size;
public MyLinkedList(){
this.head = null;
this.last = null;
this.size = 0;
}
/**
* 向链表尾部添加节点
* @param obj
*/
public void add(Object obj) {
Node l = last;
Node node = new Node(obj);
last = node;
if(head == null) {
head = node;
} else {
l.next = node;
}
size++;
}
/**
* 向链表中指定位置插入节点
* 创建以个新的节点,找到要插入位置的前一个节点,让新节点的next指向前一个节点的next,
* 然后再把前一个节点的next指向新的节点
* @param index 要插入的位置,第X个
* @param obj
*/
public void insert(int index, Object obj) {
Node node = head;
Node newNode = new Node(obj);
int i = 0;
if(index == 0) {
newNode.next = head;
head = newNode;
}else {
//找到要插入位置的前一个节点
while (node != null && i<index-1) {
node = node.next;
i++;
}
if(node == null) {
throw new RuntimeException("指定索引超出现有的长度");
}
newNode.next = node.next;
node.next = newNode;
}
size++;
}
/**
* 删除指定位置的节点
* 找到指定元素的前一个节点,然后设置前一个节点的next为指定删除节点的next
* @param index
*/
public void remove(int index) {
Node node = head;
int i = 0;
while (node != null && i<index-2) {
node = node.next;
i++;
}
node.next = node.next.next;
size--;
}
/**
* 改变指定位置的节点内容
* @param index
* @param obj
*/
public void modify(int index,Object obj){
Node node = head;
int i = 0;
while(node!=null && i<index-1){
//找到第index个结点
node=node.next;
i++;
}
node.data = obj;
}
/**
* 获取表长度
* @return
*/
public int size() {
return this.size;
}
}