eclipse运行结果截图:
源码:
/**
* 自己编写的一个LinkedList容器的实现类MyLinkedList
* 功能:依次递增节点、删除某个节点、修改替换某个节点、插入某个节点、获取某个节点等主要功能
* @author 绝尘
*
*/
public class MyLinkedList {
//这是一个容器的类:LinkedList链表自实现
//容器里面装节点Node,Node也是类
//第一个节点、最后一个节点
Node firstNode;
Node lastNode;
int size;
public void checkRange(int index) {
Node node = firstNode;
int i=0;
while(node!=null)
{
node = node.next;
i++;
}
if(index < 0 || index > i-1)
throw new RuntimeException("索引超出容器范围:"+index);
}
//get(int index)
public Node get(int index) {
checkRange(index);//检查索引index是否合法,非法则抛出异常
return getIndexNode(index);
}
//set(int index,Object obj)
public void set(int index,Object obj) {
checkRange(index);//检查索引index是否合法,非法则抛出异常
Node newNode = new Node();
newNode.element = obj;
Node indexNode = getIndexNode(index);
if(index == 0 && size == 0)
{
addNode(obj);
}
if(index == 0 && size == 1)
{
firstNode = newNode;
}
if(index == 0 && size > 1)
{
newNode.next = firstNode.next;
firstNode.next.previous = newNode;
firstNode = newNode;
}
if(index == size-1 && size == 1)
{
lastNode = newNode;
}
if(index == size-1 && size > 1)
{
newNode.previous = lastNode.previous;
lastNode.previous.next = newNode;
lastNode = newNode;
}
if(index > 0 && index < size-1)
{
newNode.previous = indexNode.previous;
newNode.next = indexNode.next;
indexNode.previous.next = newNode;
indexNode.next.previous = newNode;
}
}
public void removeIndexNode(int index) {
checkRange(index);//检查索引index是否合法,非法则抛出异常
Node temp = getIndexNode(index);
Node up = temp.previous;
Node down = temp.next;
if(up == null && down == null) {
firstNode = null;
}
if(up == null && down != null) {
down.previous = null;
firstNode = down;
}
if(up != null && down == null) {
up.next = null;
lastNode = up;
}
if(up != null && down != null) {
up.next = down;
down.previous = up;
}
size--;
}
public void insertIndexNode(int index,Object obj) {
checkRange(index);//检查索引index是否合法,非法则抛出异常
Node node = new Node();
node.element = obj;//欲插入的节点node
Node temp = getIndexNode(index);
//bb cc dd ee
if(index == 0) {
node.next = firstNode;
firstNode.previous = node;
firstNode = node;
}
if(index > 0 && index <= size-1) {
node.previous = temp.previous;
node.next = temp;
temp.previous.next = node;
temp.previous = node;
}
size++;
}
public Node getIndexNode(int index) {
Node node = firstNode;
int i = 0;
while (true) {
if(i==index)
return node;
i++;
node = node.next;
}
}
public void addNode(Object obj) {
Node newNode = new Node();//新建一个节点newNode
newNode.element = obj;//节点newNode的元素放obj
//一个新节点创建好,准备加入list1
//放第一个
if(firstNode == null){
firstNode = newNode;
lastNode = firstNode;//最后一个节点 也是第一个节点
this.size++;
}
//放第二个 第三个...
else {
newNode.previous = lastNode;
lastNode.next = newNode;
lastNode = newNode;
this.size++;
}
}
public String toString() {
if(size == 0) return null;
Node temp = new Node();
StringBuilder sb = new StringBuilder("[");
temp = firstNode;
while(temp != null) {
//System.out.println(temp.element);
sb.append(temp.element+",");
temp = temp.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
MyLinkedList list1 = new MyLinkedList();
list1.addNode("aa");//依次增加节点
list1.addNode("bb");
list1.addNode("cc");
list1.addNode("dd");
list1.addNode("ee");
System.out.println(list1);//打印对象:要得到对象的内容的话,需要重写toString
//否则打印的就是对象的引用地址如:MyLinkedList@15db9742
System.out.println(list1.get(2).element);//获取索引为2处的节点.element
list1.removeIndexNode(0);//移除list1对象自身索引为0的节点
System.out.println(list1);
System.out.println(list1.size);
list1.insertIndexNode(2,"c1c1");//在索引为2处插入element值为"c1c1"的节点
System.out.println(list1);
System.out.println(list1.size);
list1.set(2,"c2c2");//索引为2处 修改为element值为"c2c2"的节点
System.out.println(list1);
System.out.println(list1.size);
}
}
class Node {//节点类
//一个Node 有自身、上一Node、下一Node
Object element;
Node next;
Node previous;
}