线性表续篇-线性表的链式表示

/**

  • 线性表的链式表示:
  • 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)
  • 采用带虚拟头节点的链表
  • @author hopefully

*/

public class _04linearList02<T> {
	//内部类定义节点
	public static class Node<T>{
		public T data;
		public Node<T> next;
		//初始化指针域
		private Node(Node<T> n) {
			next=n;
		}
		//初始化指针域和数据域
		private Node(T obj,Node<T> n) {
			data=obj;
			next=n;
		}
		//得到当前节点的数据域
		public T getData() {
			return data;
		}
		//得到当前节点的指针域
		public Node<T> getNext(){
			return next;
		}
	}
	//链表的长度
	private int length;
	//链表的虚拟头节点
	private Node<T> head;
	//单链表初始化
	public _04linearList02() {
		//线性表为空
		length=0;
		head=new Node<T>(null);
	}
	//链表的长度
	public int size() {
		return length;
	}
	//线性表是否为空
	public boolean isEmpty() {
		return length==0;
	}
	//返回链表的头节点
	public Node<T> getHead(){
		return head;
	}
	//单链表的插入
	public boolean add(T obj,int pos) {
		if(pos<1||pos>length+1) {
			System.out.println("pos值不合法");
			return false;
		}
		int num=1;
		//p指向待删除节点的前一个节点
		Node<T> p=head;
		while(num<pos) {
			p=p.next;
			num++;
		}
		Node<T> s=new Node<T>(obj, null);
		s.next=p.next;
		p.next=s;
		length++;
		return true;
	}
	//单链表的删除
	public Node<T> delete(int pos){
		if(isEmpty()) {
			System.out.println("链表为空");
			return null;
		}
		if(pos<1||pos>length) {
			System.out.println("pos值不合法");
			return null;
		}
		Node<T> p=head;
		int num=1;
		while(num<pos) {
			p=p.next;
			num++;
		}
		Node<T> res=p.next;
		p.next=p.next.next;
		length--;
		return res;
	}
	//单链表的查找
	public int find(T obj) {
		if(isEmpty()) {
			System.out.println("链表为空");
			return -1;
		}
		Node<T> p=head.next;
		int num=1;
		while(p!=null) {
			if(!p.data.equals(obj)) {
				p=p.next;
				num++;
			}else {
				return num;
			}
		}
		return -1;
	}
	//获取单链表第pos个节点的值
	public T value(int pos) {
		if(isEmpty()) {
			System.out.println("链表为空");
			return null;
		}
		if(pos<1||pos>length) {
			System.out.println("pos不合理");
			return null;
		}
		int num=1;
		Node<T> p=head.next;
		while(num<pos) {
			p=p.next;
			num++;
		}
		return p.data;
	}
	//更新单链表第pos个节点的值
	public boolean modify(T obj, int pos) {
		if(isEmpty()) {
			System.out.println("链表为空");
			return false;
		}
		if(pos<1||pos>length) {
			System.out.println("pos不合理");
			return false;
		}
		int num=1;
		Node<T> p=head.next;
		while(num<pos) {
			p=p.next;
			num++;
		}
		p.data=obj;
		return true;
	}
	//遍历单链表
	public void iterator() {
		Node<T> p=head.next;
		while(p!=null) {
			System.out.print(p.data+" ");
			p=p.next;
		}
		System.out.println();
	}
	//清空单链表
	public void clear() {
		head.next=null;
		length=0;
	}
	public static void main(String[] args) {
		_04linearList02<Integer> singleLinkedList=new _04linearList02<Integer>();
		System.out.println("链表的长度:");
		System.out.println(singleLinkedList.size());
		System.out.println("链表的头节点:");
		Node<Integer> head = singleLinkedList.getHead();
		System.out.println(head);
		System.out.println(head.getData());
		System.out.println(head.getNext());
		singleLinkedList.add(2, 1);
		singleLinkedList.add(8, 1);
		singleLinkedList.add(9, 1);
		singleLinkedList.add(1, 1);
		singleLinkedList.add(15, 1);
		singleLinkedList.add(20, 1);
		singleLinkedList.iterator();
		singleLinkedList.delete(3);
		singleLinkedList.iterator();
		int find = singleLinkedList.find(0);
		System.out.println("find="+find);
	}
	
}

转载请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值