离散的存储空间——链表

2016.06.06


上课内容:链表


       前面我们有讲到数组队列,知道它的优点是查询快,元素是整块添加的,而与数组列表相反,链表添加很快,比较方便插入和删除操作,但它查询慢,元素是离散的。

       链表由一系列结点组成,结点可以在运动时动态生成。每个结点包括两个部分:一个是存储数据结构的数据域,另一个是存储下一个结点地址的指针。


      下面我们来介绍俩种链表。


      单链表:由两部分组成:

      一个是结点的数据,用data表示。

      另一个是结点指向的地址,用next表示。

      我们从一个根节点开始,它有一个data,当我们需要再建立一个节点时,把next指向下一个节点的地址,这样就达到了连接的效果。链表的好处就在于当创建一个节点时,就会开辟一段内存空间,删除一个节点时,就会释放一段内存空间。这样大大节省了内存空间。

    

        双向链表:由三部分组成:

        一个是该节点的数据,用data表示。

        一个存储直接子节点地址,一般称为右链域。        一个存储直接父节点地址,一般称之为左链域。

       下面我们举例说明:

public class Manager {	
	public static void main(String[] arg){
		//创建一个字符串的链表
		MyLinkList<String> list = new MyLinkList<String>();		
		//添加字符串
		list.add("hello");
		list.add(" ");
		list.add("world");		
		//获取所有的元素并且输出
		for(int i=0; i<list.getLength(); i++){
			System.out.print(list.get(i));
		}				
	}
}
public class Node<E> {
	//保存数据
	E data;

	//下一个节点
	Node<E> next;
	
	//根据数据新建节点
	Node(E e){
		data = e;
	}
	
	//无参的构造方法
	Node(){
		
	}
	
} 
public class MyLinkList<E> implements MyList<E>{
	//长度
	private int size;
	//头节点
	private Node<E> head;
	//尾节点
	private Node<E> tail;
	
	
	
	
	
	@Override
	public void add(E e) {
		//新建一个节点
		Node<E> newNode = new Node<E>(e);
		if(size == 0){//如果是第一个节点
			//头节点和尾节点都指向第一个节点
			head = newNode;
			tail = newNode;
		}else{
			//把新节点添加到末尾
			tail.next = newNode;
			//把尾节点修改为新节点
			tail = newNode;
		}
		//长度+1
		size++;
	}

	@Override
	public void delete(int index) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int getLength() {
		// TODO Auto-generated method stub
		return size;
	}

	@Override
	public void update(int index, E newE) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public E get(int index) {//从头节点开始往后一个个的查询
		//新建一个节点,等于头节点
		Node<E> node = head;
		
		for(int i=0; i<index; i++){
			//往后移动一个
			node = node.next;
		}
				
		return node.data;
	}

}
 public interface MyList<E>{
	/**
	 * 添加一个元素
	 * @param e 需要添加的元素
	 */
	public void add(E e);
	
	/**
	 * 删除指定位置的元素
	 * @param index  需要删除元素的下标
	 */
	public void delete(int index);
	
	/**
	 * 获取元素个数
	 * @return 元素的个数
	 */
	public int getLength();
	
	/**
	 * 修改指定下标的元素
	 * @param index 需要修改的元素下标
	 * @param newE 新的元素
	 */
	public void update(int index,E newE);
	
	/**
	 * 获取指定下标的元素
	 * @param index 元素下标
	 * @return 需要获取的元素
	 */
	public E get(int index);
}
public class test {

	public Node createlink() {
		Node root = new Node();
		String s0 = "a";
		Object o = (String) s0;
		root.data = o;

		Node next1 = new Node();
		String s1 = "b";
		Object o1 = (String) s1;
		next1.data = o1;

		Node next2 = new Node();
		String s2 = "c";
		Object o2 = (String) s2;
		next2.data = o2;

		Node next3 = new Node();
		String s3 = "d";
		Object o3 = (String) s3;
		next3.data = o3;

		Node next4 = new Node();
		String s4 = "e";
		Object o4 = (String) s4;
		next4.data = o4;

		Node next5 = new Node();
		String s5 = "f";
		Object o5 = (String) s5;
		next5.data = o5;

		root.next = next1;
		next1.next = next2;
		next2.next = next3;
		next3.next = next4;
		next4.next = next5;

		return root;
	}

	public void println(Node root) {
		int i = 1;
		while (null != root) {
			Object data = root.data;
			root = root.next;

			System.out.println("第" + i + "个节点是" + data);
			i++;

		}
	}
	public Node delet(Node root, int index) {
		if (index == 1) {
			root = root.next;
			return root;
		} else {
			Node temp=root;
			for (int i = 1; i < index - 1; i++) {
				root = root.next;
			}
			root.next = root.next.next;
			return temp;
		}
		
	}	
	public static void main(String[] args) {
		test te = new test();
		Node root = te.createlink();
		te.println(root);
		root=te.delet(root, 3);
		te.println(root);
	
	}
}

 


      

       

猜你喜欢

转载自3056434592.iteye.com/blog/2303353