package 单链表;
//一个节点
public class Node {
//节点内容
int data;
//下一个节点
Node next;
public Node(int data) {
this.data = data;
}
//为节点追加节点
public Node append(Node node) {
Node currentNode = this;
while(true) {
//取出下一个节点
Node nextNode = currentNode.next;
//如果没有下一个节点
if(nextNode == null)
break;
//赋值给当前节点
currentNode = nextNode;
}
currentNode.next = node;
return this;
}
//显示所有节点信息
public void show() {
Node currentNode = this;
while(true) {
System.out.print(currentNode.data + " ");
//取出下一个节点
currentNode = currentNode.next;
if(currentNode == null)
break;
}
System.out.println(" ");
}
//插入一个节点
public void after(Node node) {
//取出下一个节点
Node nextNext = next;
//把新节点作为当前节点的下一个节点
this.next = node;
//把下下一个节点作为新节点的下一个节点
node.next = nextNext;
}
//删除下一个节点
public void removeNext() {
//取出下下一个节点
//1,2 ---> 2,3 ----> 3,4
Node newNext = next.next;
//把下下一个节点设置为当前节点的下一个节点
this.next = newNext;
}
//获取下一个节点
public Node next() {
return this.next;
}
//获取节点中的数据
public int getData() {
return this.data;
}
//当前节点是否是最后一个节点
public boolean isEmpty() {
return next == null;
}
}
具体原理如下:
链表类似于火车,由每一个节点组成,每个节点内有两部分的东西
- 一部分是链表所携带的DATA数据
- 另一部分是一个地址,用来指向下一个节点
因为地址是一个节点,所以地址也是Node类型的
追加节点(在最后加一个Node)
- 声明一个新的节点currentNode,并且把第一个节点赋值给它
- 判断当前节点的地址值,是否指向下一节点(即currentNode.next != null);
- 若currentNode.next为空,即说明地址为指向任何东西(currentNode为最后一个节点)
- 此时把currentNode.next指向新增的node
//插入一个节点
public void after(Node node) {
//取出下一个节点
Node nextNext = next;
//把新节点作为当前节点的下一个节点
this.next = node;
//把下下一个节点作为新节点的下一个节点
node.next = nextNext;
}
插入一个节点
例如(1,2)--->(2,3)--->(3,4) (data,address)
想要在原链表中插入一个新的节点,比如(1,2)后面
只需要令原节点(1,2)的地址值address指向(newData,newAddress)
插入的节点的地址值newAddress指向(2,3)
即新链表为(1,2)--->(newData,newAddress)--->(2,3)--->(3,4)
故先取出指向(2,3)的值(原来节点(1,2)的地址值)Node nextNext = next:
然后令新节点的地址值指向next,即node.next = nextNext;
原节点(1,2)的地址值指向新节点 this.next = node;
public void removeNext() {
//取出下下一个节点
//1,2 ---> 2,3 ----> 3,4
Node newNext = next.next;
//把下下一个节点设置为当前节点的下一个节点
this.next = newNext;
}
删除节点
例如(1,2)--->(2,3)--->(3,4) (data,address)
想要删除节点(2,3)
只需要令节点(1,2)的地址值address指向节点(3,4)即可
即(1,2)--->(3,4)
先获取指向节点(3,4)的值,即节点(2,3)的地址值
newNext = next.next
然后第一个的地址值this.next = newNext即可