Java数据结构之线性表---链表存储

今天早上起来又接着用链表实现了线性表的部分功能,实现的结果如下:

package 线性表;
public class ListADT {
	/*
	 * 使用链表实现线性表
	 * 定义链表的节点类
	 */
	//ListNode list = new ListNode();//创建一个节点的引用,然而这样引用是错误的,每次都有一个0
	private ListNode list;//链表头节点的引用
	public class ListNode{
		public int data;//链表中的数据
		public ListNode next;//指针
		
		public  ListNode() {//构造一个节点,data 0 and null link
			this(0,null);
		}
		
		public ListNode(int data) {//构造一个节点,with given data and null link
			this(data,null);
		}
		public ListNode(int data,ListNode next) { //构造节点,有数据data和link
			this.data = data;
			this.next = next;
		}
	}
	//显示数据
	public void disply() {
		ListNode current = list;
		while( current != null ) {
			System.out.println(current.data);
			current = current.next;
			
		}	
	}
	//追加新节点,添加元素
	public void add(int value) {
		//判断链表为空的情况
		if( list == null ) {
			list = new ListNode(value);
		}else {
			ListNode current = list;
			while( current.next != null ) {
				current = current.next;
			}//执行完这个循环操作,current指向的是链表的最后一个节点
			current.next = new ListNode(value);
		}
	}
	//在指定位置添加元素
	public void add(int index,int value) {
		if(index == 0) {
			list = new ListNode(value,list);
		}else {
			ListNode current = list;
			for(int i=0;i<index-1;i++) {//从头节点找到索引处的值
				current = current.next;
			}
			current.next = new ListNode(value,current.next);
//			ListNode temp = new ListNode(value,current.next);//加入元素的next节点指向下一个节点
//			current.next = temp;//将节点连接在链表上
		}
	}
	//删除元素
	public void remove(int index) {
		if(index==0) {
			list = list.next;
		}else {
			ListNode current = list;
			for(int i=0;i<index-1;i++) {
				current = current.next;
			}
			current.next = current.next.next;
		}
	}
	//定位链表特定节点
	private ListNode nodeAt(int index) {//这个功能虽然定义了,实际并没有使用,感兴趣的小伙伴可以试一下
		ListNode current = list;
		for(int i=0;i<index;i++) {
			current = current.next;
		}
		return current;
	}
	
	//链表大小
	public int size() {
		int count = 0;
		ListNode current = list;
		while(current!=null) {
			current = current.next;
			count++;
		}
		return count;
	}
	//获取链表内对应元素的位置
	public int indexOf(int value) {
		int index = 0;
		ListNode current = list;
		while(current!=null) {
			if(current.data == value ) {
				return index;
			}
			index++;
			current = current.next;
		}
		return -1;
	}
	//toString方法,虽然我并不知道这是做什么卵用的??
	public String toString() {
		if (list==null) {
			return "[]";
		}else {
			String result = "["+list.data;
			ListNode current = list.next;
			while(current!=null) {
				result += ","+current.data;
				current = current.next;
			}
			result += "]";
			return result;
		}
	}
	//清除链表数据
	public void clear() {
		ListNode current = list;//创建头结点引用
		while(current!=null) //循环遍历链表
		{
			current = current.next;
			list = current;//头节点指向最后一个节点完成删除
		}
	}
	//添加数据使链表依然保持有序状态
	public void addSorted(int value) {
		ListNode current = list;
		if(current == null || current.data>=value) {
			current = new ListNode(value, current);
		}else {
		while(current!=null && current.next.data<value) 
		 {
			current = current.next;
			current.next = new ListNode(value,current.next);
		 }
	   }
	}
	//判断某个元素是否包含在链表中
	public boolean contains(int value) {
		ListNode current = list;
		while(current!=null) {
			current = current.next;
			if(current.data == value || list.data == value) {
				return true;
			}//return false;
		}
		return false;//这里返回值不知道出什么问题????
	}

}

下面给出测试的程序。但是在用contains判断时,元素不存在会跳出来异常,我也改不出来,找不到原因,所以暂且先放下,回头再仔细琢磨。或者哪位大牛知道问题所在,不妨给我指点一下,十分感谢。

package 线性表;
import java.util.LinkedList;
public class ListADTtest {
	public static void main(String[] args) {
			ListADT ld = new ListADT();
			ld.add(1);
			ld.add(2);
			ld.add(6);
			ld.add(9);
			ld.add(4, 15);
			ld.addSorted(5);
			ld.addSorted(3);
//			System.out.println(ld.toString());
//			ld.clear();//删除线性表
			ld.disply();
			System.out.println(ld.contains(100));
	}

}

完!

猜你喜欢

转载自blog.csdn.net/weixin_44961794/article/details/89489221