自定义LinkedList类(单链表)

自定义链表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());
		
		
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_42882887/article/details/82142358