自定义链表LinkedList,实现LinkedList的部分方法,理解LinkedList的方法原理。
一,定义节点类
package LinkedList;
public class Node {
private Object data;//定义数据域
private Node next;//注意这里的next的类型是Node
//构造函数1,空节点
public Node() {
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(Object data) {
super();
this.data = data;
}
}
二,定义MyLinkedList
private Node root = new Node();//空节点
private Node last = root;
private Object data;
private int size = 0;
方法一:public int size()
//返回链表中非空节点数
public int size() {
return size;
}
方法二:public void add(Object data)
//添加节点的方法
public void add(Object data) {
Node node = new Node(data);
if(size == 0) {
root.setNext(node);
last = node;
System.out.println("添加的第---0---个节点的值为"+last.getData());
size++;
}else {
last.setNext(node);
last = node;
System.out.println("后续添加的节点----"+size+"----的值为-----"+last.getData());
size++;
}
}
方法三:public Object get(int index)
//得到下标为index的节点的值
public Object get(int index) {
if(index < 0 || index > size) {
return null;
}
Node node = root.getNext();//得到第一个非空节点
if(index == 0) {
return node.getData();
}else {
for(int i = 0;i<index;i++) {
node = node.getNext();
//System.out.print(node.getData()+"--->");
}
return node.getData();
}
}
方法四:public Object add(int index,Object data)
//向linkedlist中下标为index的位置添加节点
public Object add(int index,Object data) {
if(index<0 || index>size) {
return null;
}
Node node = new Node(data);//需要插入的节点,返回插入节点的值
//如果index为0,则在第一个非空节点位置添加节点
if(index == 0) {
Node node_original = root.getNext();//得到第一个非空节点
root.setNext(node);
node.setNext(node_original);
size++;
return node.getData();
}else {
Node node_before = root.getNext();//得到第一个非空节点
for(int i=0;i<index-1;i++) {
node_before = node_before.getNext();//得到插入节点的前一个节点
}
//得到当前插入的节点位置处的原节点
Node node_original = node_before.getNext();
//将node_before指向插入的节点
node_before.setNext(node);
//将node指向节点node_original
node.setNext(node_original);
size++;
return node.getData();
}
方法五:public Object remove(int index)
//移除linkedlist中下标为index的位置的节点,返回移除节点的值
public Object remove(int index) {
if(index<0 || index>size) {
return null;
}
if(index == 0) {//如果移除的是第一个非空节点
Node node_1 = root.getNext();//得到第一个非空节点
Node node_2 = node_1.getNext();//得到第二个非空节点
root.setNext(node_2);
node_1.setNext(null);//随后Java虚拟机会自动回收
size--;
return node_1.getData();
}else {
//如果移除的不是第一个节点
//首先得到该index位置下的前一个和后一个节点
Node node_before = root.getNext();//得到第一个非空节点
for(int i=0;i<index-1;i++) {
node_before = node_before.getNext();//得到移除节点位置的前一个节点
}
Node node_original = node_before.getNext();//得到移除的节点
Node node_next = node_original.getNext();//得到移除节点的后一个节点
//接下来将node_before节点指向node_next
node_before.setNext(node_next);
//还要将node_original指向空
node_original.setNext(null);
size--;
return node_original.getData();
}
}
方法六:public void clear()
//清除链表中的所有节点
public void clear(){
while(root.getNext() != null) {
Node node = root.getNext();//取得第一个非空节点
Node node_latter = node.getNext();
root.setNext(node_latter);
System.out.println("删除节点的数据域值为--->"+node.getData());
node.setNext(null);
size--;
}
}
测试
定义Test类,来调用以上写的方法,结果如下:
首先随机添加几个节点,并设置节点的数据域的值(这里举例的数据域的值用的是int型,实际上可以是任意类型)
**一,**随机添加任意个节点
**二,**在指定位置添加节点
**三,**在指定位置移除节点
**四,**移除所有节点
方法验证完毕!
源代码:
节点类
package LinkedList;
public class Node {
private Object data;
private Node next;//注意这里的next的类型是Node
//private void set
//构造函数1,空节点
public Node() {
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(Object data) {
super();
this.data = data;
}
}
MyLinkedList类
package LinkedList;
import java.util.LinkedList;
/*
* 自定义LinkedList类
* 方法
* 1.add(data);
* 2.get(index);
* 3.size();
* 4.add(index,data);
* 5.remove(index);
* 6.clear();
*/
public class MyLinkedList {
private Node root = new Node();//空节点
private Node last = root;
private Object data;
private int size = 0;
public int size() {
return size;
}
//构造方法
public MyLinkedList() {}
//添加节点的方法
public void add(Object data) {
Node node = new Node(data);
if(size == 0) {
root.setNext(node);
last = node;
System.out.println("添加的第---0---个节点的值为"+last.getData());
size++;
}else {
last.setNext(node);
last = node;
System.out.println("后续添加的节点----"+size+"----的值为-----"+last.getData());
size++;
}
}
//得到下标为index的节点的值
public Object get(int index) {
if(index < 0 || index > size) {
return null;
}
Node node = root.getNext();//得到第一个非空节点
if(index == 0) {
return node.getData();
}else {
for(int i = 0;i<index;i++) {
node = node.getNext();
//System.out.print(node.getData()+"--->");
}
return node.getData();
}
}
//向linkedlist中下标为index的位置添加节点
public Object add(int index,Object data) {
if(index<0 || index>size) {
return null;
}
Node node = new Node(data);//需要插入的节点,返回插入节点的值
//如果index为0,则在第一个非空节点位置添加节点
if(index == 0) {
Node node_original = root.getNext();//得到第一个非空节点
root.setNext(node);
node.setNext(node_original);
size++;
return node.getData();
}else {
Node node_before = root.getNext();//得到第一个非空节点
for(int i=0;i<index-1;i++) {
node_before = node_before.getNext();//得到插入节点的前一个节点
}
//得到当前插入的节点位置处的原节点
Node node_original = node_before.getNext();
//将node_before指向插入的节点
node_before.setNext(node);
//将node指向节点node_original
node.setNext(node_original);
size++;
return node.getData();
}
}
//移除linkedlist中下标为index的位置的节点,返回移除节点的值
public Object remove(int index) {
if(index<0 || index>size) {
return null;
}
if(index == 0) {//如果移除的是第一个非空节点
Node node_1 = root.getNext();//得到第一个非空节点
Node node_2 = node_1.getNext();//得到第二个非空节点
root.setNext(node_2);
node_1.setNext(null);//随后Java虚拟机会自动回收
size--;
return node_1.getData();
}else {
//如果移除的不是第一个节点
//首先得到该index位置下的前一个和后一个节点
Node node_before = root.getNext();//得到第一个非空节点
for(int i=0;i<index-1;i++) {
node_before = node_before.getNext();//得到移除节点位置的前一个节点
}
Node node_original = node_before.getNext();//得到移除的节点
Node node_next = node_original.getNext();//得到移除节点的后一个节点
//接下来将node_before节点指向node_next
node_before.setNext(node_next);
//还要将node_original指向空
node_original.setNext(null);
size--;
return node_original.getData();
}
}
//清除链表中的所有节点
public void clear(){
while(root.getNext() != null) {
Node node = root.getNext();//取得第一个非空节点
Node node_latter = node.getNext();
root.setNext(node_latter);
System.out.println("删除节点的数据域值为--->"+node.getData());
node.setNext(null);
size--;
}
}
}
测试代码:
package LinkedList;
import java.util.Random;
public class Test {
public static void main(String[] args) {
MyLinkedList linkedlist = new MyLinkedList();
Random rand = new Random();
int a = rand.nextInt(5)+5;
System.out.println("添加节点的个数为---"+a+"---");
for(int i = 0;i<a;i++) {
linkedlist.add(rand.nextInt(100)+10);
}
System.out.println();
System.out.println();
System.out.println("打印当前链表");
for(int i=0;i<linkedlist.size();i++) {
System.out.println(i+"--->"+linkedlist.get(i));
}
System.out.println();
System.out.println();
System.out.println("--------添加节点--------");
System.out.println();
System.out.println("---在第--0--一个非空节点位置添加节点---节点的数据指定为880");
linkedlist.add(0,88);
System.out.println("打印添加该节点后的链表");
for(int i=0;i<linkedlist.size();i++) {
System.out.println(i+"--->"+linkedlist.get(i));
}
System.out.println();
System.out.println("---在第--4--位置添加节点---节点的数据指定为100");
linkedlist.add(4,100);
System.out.println("打印添加该节点后的链表");
for(int i=0;i<linkedlist.size();i++) {
System.out.println(i+"--->"+linkedlist.get(i));
}
System.out.println();
System.out.println();
System.out.println();
System.out.println("--------移除节点--------");
System.out.println();
System.out.println("-----移除第--0--一个非空节点位置处的节点----");
System.out.println("第--0--个位置上节点的数据域的值为---->"+linkedlist.remove(0));
System.out.println("打印移除该节点后的链表");
for(int i=0;i<linkedlist.size();i++) {
System.out.println(i+"--->"+linkedlist.get(i));
}
System.out.println();
System.out.println("-----移除第--4--一个非空节点位置处的节点----");
System.out.println("第--4--个位置上节点的数据域的值为---->"+linkedlist.remove(4));
System.out.println("打印移除该节点后的链表");
for(int i=0;i<linkedlist.size();i++) {
System.out.println(i+"--->"+linkedlist.get(i));
}
System.out.println();
System.out.println("--------删除所有节点--------");
linkedlist.clear();
System.out.println("--------现在的节点数为-------->"+linkedlist.size());
}
}