`
百合不是茶
  • 浏览: 354041 次
社区版块
存档分类
最新评论

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

阅读更多

 

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

 

   

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

 

实现代码:

 

    

//定义动态链表
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
分享到:
评论

相关推荐

    数据结构-双向链表

    双向链表是一种特殊的数据结构,它在编程中具有重要的应用。本文将深入探讨双向链表的概念,实现,以及如何进行基本操作。 双向链表,顾名思义,是一种链式存储结构,其中每个节点包含两个指针,一个指向前一个节点...

    数据结构 单向链表 双向链表 源程序

    本文将深入探讨两种重要的线性数据结构——单向链表和双向链表,以及它们在实际编程中的应用。 单向链表是一种线性数据结构,它的每个元素(称为节点)包含两部分:数据域,用于存储实际的数据;指针域,用于存储下...

    数据结构双向链表

    双向链表是数据结构中的一种,尤其在处理需要前后移动元素的问题时,它的优势尤为突出。本篇文章将详细探讨双向链表的基本概念、结构以及实现,旨在帮助初学者理解并掌握这一重要知识点。 双向链表是一种线性数据...

    数据结构 双向链表存储

    双向链表是一种重要的线性数据结构,它扩展了单链表的概念,允许在数据元素之间进行双向链接。这种数据结构使得在链表中的前一个和后一个元素之间进行导航变得容易。 双向链表的每个节点包含三部分:数据域、前向...

    数据结构链表的课程设计

    数据结构链表的课程设计 本资源是关于数据结构链表的课程设计,包括了链表的程序源代码。下面是对标题、描述、标签和部分内容的详细解释: 标题:数据结构链表的课程设计 这个标题表明了该资源的主要内容是关于...

    数据结构单向链表和双向链表

    1. **节点结构**:双向链表的节点包含三个字段:数据、向前的指针和向后的指针。 2. **链表头尾**:双向链表有头节点和尾节点,头节点的前一个节点是null,而尾节点的后一个节点也是null。 3. **插入操作**:在...

    数据结构源代码之双向链表

    ### 数据结构源代码之双向链表 #### 概述 本文档主要介绍如何通过C语言实现双向链表的基本操作。继单链表之后,双向链表作为一种更灵活的数据结构,支持从前向后以及从后向前的遍历。双向链表在每个节点中除了包含...

    数据结构 链表 队列 堆栈

    完整代码 正确产生结果 三个类分开写 class linklist { protected: struct node { int data; node *next; }; node *head; int length; public:

    数据结构链表

    数据结构 链表 C语言 双向链表 自己照着书写的

    C++ 数据结构 链表

    本文将深入探讨C++中的三种关键链表数据结构:单链表、循环链表和双向链表,以及如何通过面向对象编程来实现它们。 1. **单链表**: 单链表是最基础的链式数据结构,每个节点包含一个数据元素和一个指向下一个节点...

    数据结构中的双向链表的代码实现

    在计算机科学领域,数据结构是组织和管理数据的重要方式,而双向链表是其中一种基本的数据结构。双向链表与单向链表不同,它在每个节点中存储了两个指针,一个指向前一个节点,另一个指向后一个节点,使得在链表中...

    内核数据结构之双向循环链表

    双向循环链表是一种重要的数据结构,广泛用于实现各种内核级别的数据组织,如内存管理、进程控制块等。本篇文章将深入探讨这种数据结构,包括`list_head`、`list_entry`以及相关的遍历宏`list_for_each`。 首先,...

    数据结构链表的操作程序

    数据结构链表的操作程序 初始化,删除,添加等完成的链表操作。供大家分享

    数据结构课程设计(双向链表)

    双向链表是一种重要的线性数据结构,它在很多编程任务中都有广泛的应用。本课程设计主要关注双向链表的实现及其排序算法,这对于理解和掌握数据结构至关重要。 双向链表与单向链表不同,每个节点不仅包含数据,还...

    链表 数据结构 链表

    数据结构 链表

    数据结构 双向链表(C++)

    双向链表是一种特殊的数据结构,它在计算机程序设计中扮演着重要角色,特别是在C++这样的编程语言中。本节将深入探讨双向链表的概念、其结构、操作以及C++中的实现。 双向链表与单链表不同,它允许每个节点不仅有一...

    数据结构之双向链表

    双向链表是一种重要的线性数据结构,与常见的单向链表相比,它具有更丰富的操作能力。本文将深入探讨双向链表的概念、特点、实现方式以及在给定的“DoubleLink”压缩包中可能包含的相关功能。 双向链表(Doubly ...

    C++双向链表统计文章单词出现频率

    在这个特定的项目中,“C++双向链表统计文章单词出现频率”是一个涉及数据结构和算法的应用,目标是实现一个程序来分析文本文件,计算并显示文章中每个单词出现的次数。双向链表作为数据结构的核心,其特点是每个...

    java 数据结构 链表

    链表是一种基础且重要的数据结构,它在计算机科学和编程,尤其是Java中有着广泛的应用。与数组不同,链表中的元素并不在内存中连续存储,而是通过节点间的引用(或称为指针)来连接。每个节点包含两部分:数据域,...

Global site tag (gtag.js) - Google Analytics