一,本篇适合初学者java 熟悉java基础以及对LinkedList初步认识
代码如下
Node类
/**2019-6-23
* 本类为一个节点类
* 定义了一个节点包括节点头(previous),尾(next),节点(element)
* 这里需要注意的是 这三个(previous element next)组成一个节点
*/
public class Node {
Node previous;
Node next;
Object element;
//生成其构造方法(三个属性都有的)
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
//(只有一个element的构造方法)
public Node(Object element) {
super();
this.element = element;
}
主代码
package cn.sxt.LinkedList;
/**
* 2019-6-23 第四版 *
*
* @author lee
*
*/
public class TextLinkedList04<E> {
// 定义第一个节点 和最后一个节点 以及链表长度
private Node first;
private Node last;
private int size;
// 定义一个插入的方法
public void add(int index, E e) {
check(index);// 输入数值不合法抛异常
Node node = new Node(e);
// 调用了getNode查找到目标对象
Node temp = getNode(index);
// 如果在第一个节点插入。那么新节点的“尾”node.next指向第一个节点
// 第一个节点的“头”指向新节点
// 新节点就变成了这个链表中的第一个节点
if (index == 0) {
node.next = first;
first.previous = node;
first = node;
size++;
}
// 如果在中间插入
if (index < size - 1 && index != 0) {
if (temp != null) {
temp.previous.next = node;
temp.previous = node;
node.next = temp;
node.previous = node;
size++;
}
}
// 如果在最后一个节点插入
// 这里直接调用add(index)方法,add(index)方法本质就是在最后一个节点位置插入
if (index == size - 1) {
last = temp;
add(e);
}
}
// remove (移除操作)
public void remove(int index) {
// 先查找到然后删除
check(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;
}
size--;// 删除一个元素size--
}
}
// 单独定义一个检测索引是否合法的方法 私有在本类中使用
private void check(int index) {
if (index < 0 || index > size - 1) {
throw new RuntimeException("位置不合法:" + index);
}
}
// get
public Object get(int index) {
// 输入数值不合法抛异常
check(index);
Node temp = getNode(index);
return temp != null ? (E) temp.element : null;
}
// 本方法不需要外部了解调用直接私有在本类中自己调用
private Node getNode(int index) {
Node temp = null;
// 本方法为了快速定位到索引位置,如果查找的位置大于二分之一的size
// 则采用从后向前索引的方式;
if (index <= (size >> 1)) {// size>>1相当于size/2
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
} else {
// 当index>(size>>1)时从后向前的索引方式
temp = last;
for (int i = size - 1; i > index; i--) {
temp = temp.previous;
}
}
return temp;
}
// 写add方法
public void add(E e) {
// 定义一个新节点
Node node = new Node(e);
// 这里声名一个判断 如果没有第一个节点(也就是 first=null)的话
// 那么第一个节点就是node 最后一个也是node
if (first == null) {
first = node;
last = node;
} else {
// 否则的话这个新节点的“头”(node.previous)就指向了最后一个节点
// 而这个节点的“尾”(node.next)就为空
node.previous = last;
node.next = null;
// 而在链表中最后一个节点的“尾”(last.next)就指向了这个新节点
last.next = node;
// 由于上面的链接所以加的这个新节点就变成了链表中最后一个节点
last = node;
}
size++;
}
// 写toString方法用于输出链表中的元素
public String toString() {
StringBuilder sb = new StringBuilder("[");
// 把这个链表的第一节点赋给temp准备从头输出
// 通过while循环逐个输出
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) {
TextLinkedList04<String> list = new TextLinkedList04<>();
// 调用add方法
list.add("aa");
list.add("bb");
list.add("cc");
list.add("ee");
list.add("ff");
list.add("gg");
// //以下是对写的方法的测试
// //调用toString方法
// System.out.println("**************************");
// System.out.println(list);
// //调用get方法
// System.out.println("**************************");
// System.out.println(list.get(0));
// //调用remove方法删除第一个节点
// list.remove(0);
// System.out.println("**************************");
// System.out.println(list);
// System.out.println(list.size);
// //调用remove方法删除中间节点
// list.remove(4);
// System.out.println("**************************");
// System.out.println(list);
// System.out.println(list.size);
// //调用add插入方法
// list.add(2, "ss");
// System.out.println("**************************");
// System.out.println(list);
// System.out.println(list.size);
// //在第一个节点插入
// list.add(0, "ps");
// System.out.println("**************************");
// System.out.println(list);
// System.out.println(list.size);
//
// //在最后一个节点插入
// list.add(5, "SS");
// System.out.println("**************************");
// System.out.println(list);
// System.out.println(list.size);
}
}