今天早上起来又接着用链表实现了线性表的部分功能,实现的结果如下:
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));
}
}
完!