当前位置:首页 > 开发 > 编程语言 > 数据结构 > 正文

自定义数据结构 链表(单项 ,双向,环形)

发表于: 2014-07-18   作者:百合不是茶   来源:转载   浏览:
摘要:      链表与动态数组的实现方式差不多,    数组适合快速删除某个元素    链表则可以快速的保存数组并且可以是不连续的       单项链表;数据从第一个指向最后一个   实现代码:        //定义动态链表 clas

 

   链表与动态数组的实现方式差不多,    数组适合快速删除某个元素    链表则可以快速的保存数组并且可以是不连续的

 

   

单项链表;数据从第一个指向最后一个

 

实现代码:

 

    

//定义动态链表
class  Node<E>{
	
	E e;//定义的节点
	Node next;//节点的下一个
	Node front ;//节点的前一个


	public Node(E e){
        this.e =(E)e;
	}


	public  String toString(){
		return (String)e;
	}
}

//创建单项链表类
public class LinkedList{
	public static void main(String[] args) {
		LinkedList list  = new LinkedList();
		Node node=list.creatNode();
		list.printlist(node);
	}


	public Node<String> creatNode(){

	Node<String> node = new  Node<String>("节点一");
	Node<String> node2 = new  Node<String>("节点二");
	Node<String> node3 = new  Node<String>("节点三");
    Node<String> node4 = new  Node<String>("节点四");	
	

	node.next = node2;
	node2.next = node3;
	node3.next = node4;

	node4.front = node3;
	node3.front = node2;
	node2.front = node;

	return node;
	
	}


	public void printlist(Node node){
       while(node!=null){
		   System.out.println(node);
		   node = node.next;
	   }
	}

}

 运行结果:

节点一

节点二

节点三

节点四

 

 

 

双向链表:可以指定前面节点也可以指向后面数据的节点

    实现链表的增删改查 等方法

 

    

/**
 * 节点类
 * 
 * @author kowloon
 * 
 */
public class Node<E> {

	E e;// 节点中的元素
	
	Node<E> front;// 对前一个节点的引用
	Node<E> next;// 对下一个节点的引用

	public Node(E e) {
		this.e = e;
	}

	@Override
	public String toString() {
		return (String) e;
	}

}

 

节点的方法

package trr0717链表;

public class LinkedList1 {
	Node head = null;
	Node foot = null;
	int count = 0;

	public Node getHead() {
		return head;
	}

	// 直接在后面增加节点
	public void add(String s) {
		Node node = new Node(s);

		if (head == null) {// 当没有头节点的时候
			head = node;
			foot = node;
		} else {// 双链表
			foot.next = node;
			node.front = foot;
		}
		foot = node;
		count++;
	}

	// 直接在后面增加节点
	public void add(int index, String s) {
		if (index < 0 || index >= size()) {// 若数组越界就抛出异常
			throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个数组"
					+ index);
		}
		Node nodenew = new Node(s);

		Node node = getNode(index);
		if (index == 0) {// 若是o下标
			node.front = nodenew;
			nodenew.next = node;

			head = nodenew;
			/* System.out.println(head+"<><><><"); */
		} else {

			Node frontnode = node.front;
			Node nextnode = node.next;

			frontnode.next = nodenew;
			nodenew.next = nextnode;
			nodenew.front = frontnode;
			nextnode.front = nodenew;
		}
		count++;
	}

	// 移除指定位置的节点
	public void remove(int index) {
		if (index < 0 || index >= size()) {// 若数组越界就抛出异常
			throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个数组"
					+ index);
		}
		if (index == 0) {
			Node n = head.next;// 先要接触引用关系
			head.next = null;
			n.front = null;
			head = n;
		}

		else {
			Node node = getNode(index);// 得到指定位置上下一个节点
			Node fnode = node.front;
			Node nextnode = node.next;
			fnode.next = nextnode;// 把指定位置的下一个节点给他上一个节点
			nextnode.front = fnode;

		}

		count--;

	}

	// 移除指定内容的节点
	public void remove(String s) {
		Node node = head;
		for (int i = 0; i < size(); i++) {
			if (node.e.equals(s)) {// 若相等
				remove(i);
				break;
			}
			node = node.next;
		}
	}

	// 修改指定地点的节点内容
	public void set(int index, String s) {
		Node n = getNode(index);
		n.e = s;
	}

	// 取得某个节点对象
	public Node getNode(int index) {
		if (index < 0 || index >= size()) {// 若数组越界就抛出异常
			throw new IndexOutOfBoundsException("数组的个数:" + size() + "第几个下标"
					+ index);
		}
		int i = 0;
		Node node = head;// 把head也放到队列里面
		while (i < index) {
			i++;
			node = node.next;

		}
		/* System.out.println("第"+i+"个节点:"+node); */

		return node;
	}

	// 链表的大小
	public int size() {
		System.out.println("数组个数:" + count);
		return count;
	}

	// 遍历链表的方法
	public static void linkedVist(Node head) {
		if (head != null) {
			System.out.println(head);
			Node node = head.next;
			linkedVist(node);
		}
	}
}

 

     

 

 

    

自定义数据结构 链表(单项 ,双向,环形)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
昨天重温了一下简单的单项链表,然后又翻了一下双向链表的内容,觉得双向链表比单项链表有用复杂。
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱
双向链表的节点定义如下: struct DuListNode{ int val; DuListNode *prev,*next; DuListNode(int x
■ 构造函数 每个构造函数都通过 this 来初始化链接域 prev 和 next.图⑴ prev = this; next = thi
概括:主要说明双向链表的基本概念和具体操作以及源代码。 一、基本概念 1.有了单链表以后我们可以
概括:主要说明双向链表的基本概念和具体操作以及源代码。 一、基本概念 1.有了单链表以后我们可以
双向循环链表,也就是在双向链表的基础上加上循环链表的特性,使其首尾相连。最后的next指针指向首
单链表的结点中只有一个指向其后继结点的指针域next,在单链表中,想要找其前驱则只能从该链表的头
先来看一下双向链表和双向循环链表的逻辑结构: 下面我们将用c/c++语言实现双向循环链表: #include
数据结构 双向链表表示和实现 参考代码如下: /* 名称:双向链表表示和实现 编译环境:VC++6.0 日期
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号