`
沐刃青蛟
  • 浏览: 7442 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

单向链表总结

 
阅读更多



 单向链表:形象点就是以上那个鬼东西!

 

         它是由一系列的节点串联成的。

 

          而在其节点中包含两部分:1.数据域   2.下一个节点

 

          而下一个节点的能使节点串联的关键

 

          以下是节点的内容:

//  <T>  表示泛型
public class Node <T> {
	
	//数据域
	public T data;
	//下一个节点
	public Node next;
	//构造函数
	Node(T data)
	{
		super();
		this.data=data;
	}

}

 

而这里的下一个节点相当于c++中的指针,它指向下一个节点!

 

      以下是链表的一些功能实现,并添加了详细的注释:

 

        (特别注意的是有一些功能的实现要将第一个节点分开独立判断的!)

 

public class Link <T> {
	
	//头节点
	private Node head;
	//尾节点
	private Node tail;
	//大小
	private int size=0;
	
	
	//添加元素
	public void add(T elem)
	{
		Node node = new Node(elem);
		//添加第一个节点,头尾节点都是(指向)它
		if(size==0)
		{
			head=node;
			tail=node;
		}
		else
		{ 
			//尾节点的下一个指向新的节点
			tail.next=node;
			//新的节点变成尾节点
			tail=node;
		}
		size++;
	}
	//去除某位置的元素
	public void remove(int index)
	{
		Node last=head;
		//判断是否为第一个节点
		if(index==0)
		{
			head=last.next;
			last=null;
		}
		else if(index>0&&index<size){
			//遍历找到index位置的节点、它的上一个节点和它的下一个节点
			for(int i=0;i<index-1;i++)
			{
				last=last.next;
			}
			//index位置的节点    node
			Node node=last.next;
			//node的下一个节点   nextNode
			Node nextNode=node.next;
			//node上一个节点跳过node指向node的下一个节点
			last.next=nextNode;
			//node 指向空
			node.next=null;
		}
		size--;
	}
	//
	public T remove2(int index)
	{
		if(index<0||index>=size||size==0)
			return null;
		size--;
		if(index==0)
		{
			Node node=head;
			head=node.next;
			node=null;
			if(size==0)
			{
				tail=null;
			}
			return (T)node.data;
		}else{
			Node last=head;
			for(int i=0;i<index-1;i++)
			{
				last=last.next;
			}
			Node node=last.next;
			Node nextNode=node.next;
			
			last.next=nextNode;
			node.next=null;
			
			
			if(index==size-1)
			{
				tail=last;
			}
			
			return (T)node.data;
		}
	}
	//改变某位置的data
	public void change(int index,T elem)
	{
		Node last=head;
		//同样,判断是否为第一个
		if(index==0)
		{
			last.data=elem;
		}
		else if(index>0&&index<=size){
			//遍历找到index位置的节点
			for(int i=0;i<index-1;i++)
			{
				last=last.next;
			}
			//找到node
			Node node=last.next;
			//将elem赋值给它的数据域
			node.data=elem;
		}
	}
	//查询某个值在链表中的位置
	public void find(T elem)
	{
		//index记录节点位置
		int index=0;
		//判断是否有要查的元素的标志
		int flag=0;
		//遍历
		for(Node node =head;node!=null;node=node.next)
		{
			//找到元素
			if(node.data==elem)
			{
				//输出位置
				System.out.println("index="+index);
				//完成有盖元素的判断
				flag=1;
			}
			index++;
		}
		//有无该元素?
		if(flag==0)
			System.out.println("该链表中无此元素");
	}
	//查找某个位置的值
	public T find(int index)
	{
		if(index<0||index>size||size==0)
			return null;
		Node node=head;
		for(int i=0;i<index;i++)
		{
			node=node.next;
		}
		return (T)node.data;
	}
	//插入
	public void insert(int index,T elem)
	{
		if(index==0)
		{
			Node newNode = new Node(elem);
			newNode.next=head;
			head=newNode;
		}
		else{
			Node last = head;
			for(int i=0;i<index-1;i++)
			{
				last=last.next;
			}
			Node node=last.next;
			Node newNode=new Node(elem);
			last.next=newNode;
			newNode.next=node;
		}
	}
	
	//输出链表
	public void showInfo()
	{
		//判断
		if(size>0)
		{
			//遍历输出元素
			for(Node node=head;node!=null;node=node.next)
			{
				System.out.print(node.data+"  ");
			}
		}
		System.out.println();
	}
	//递归法输出链表
	public void showInfo2(Node node)
	{
		if(size>0){
			//输出
			System.out.print(node.data+"  ");
			//递归调用
			if(node.next!=null)
				showInfo2(node.next);
		}
	}
	//为了方便重载函数(因为head类型为private)
	public void showInfo2()
	{
		showInfo2(head);
		System.out.println();
	}
	
	public int getSize()
	{
		return size;
	}
	
	public static void main(String [] args)
	{
		Link<Integer> link=new Link<Integer>();
		for(int i=0;i<10;i++)
		{
			link.add(i);
		}
		link.showInfo();
//		System.out.println("size="+link.getSize());
//		link.remove(123);
//		link.showInfo();
//		link.change(3, 100);
//		link.showInfo();
//		link.find(1000);
		link.insert(0, 1000);
		link.showInfo2();
		System.out.println(link.find(3));
	}
	
}

  

 

 
 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 4.7 KB
分享到:
评论

相关推荐

    C语言实现的单向链表和双向链表

    总结,单向链表适合于只需要向前移动的情况,而双向链表在需要前后移动时更有效。C语言通过结构体和指针提供了实现这两种链表的基础,理解它们的工作原理对于编写高效的算法至关重要。在实际编程中,根据具体需求...

    C#单向链表C#单向链表C#单向链表

    总结,C#中的单向链表通过`LinkedList&lt;T&gt;`类提供了丰富的操作,同时也可以通过自定义节点和链表类理解其内部机制。理解和熟练使用链表对于提升C#编程能力至关重要。无论是使用内置类还是自定义实现,链表都是解决...

    flash as3.0 实现的单向链表

    总结起来,Flash AS3.0实现的单向链表是一个很好的学习和实践数据结构的例子,它包含了链表的基本操作,有助于提升对链表的理解和编程能力。在AS3.0项目中,可以利用这样的链表类来优化数据管理,特别是在处理动态...

    C#实现单向链表C# .net 链表 单向链表

    ### C#实现单向链表 #### 一、引言 单向链表是一种常见的数据结构,在计算机科学中被广泛应用于解决各种问题。它由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。本文将详细介绍如何在C#中...

    单向链表实现

    单向链表是一种基本的数据结构,它在计算机...总结,单向链表是数据结构的基础,理解和掌握其原理和操作方法对于提升编程能力至关重要。通过深入学习和实践,可以灵活运用链表解决实际问题,提高程序的效率和灵活性。

    C语言单向建立链表的代码实现

    ### C语言单向链表的建立与操作 #### 背景介绍 在计算机科学领域,链表是一种常见的数据结构,用于存储一系列元素。每个元素(通常称为节点)包含一个数据部分以及一个指向下一个节点的指针。链表分为单向链表、...

    航班订票系统(单向,双向循环链表)

    总结,这个航班订票系统利用了数据结构的优势,以单向链表管理航班,以双向循环链表管理乘客,实现了高效的数据存储和操作。通过合理的设计和实现,该系统能够满足用户的基本需求,为实际的航班预订提供便利。

    单向链表(一) 结构体、创建链表、遍历链表

    总结来说,单向链表是一种灵活的数据结构,其节点通过指针相互连接。通过定义结构体,我们可以创建链表节点,然后使用插入函数构建链表。遍历链表则允许我们访问并处理链表中的所有元素。了解和掌握这些基础知识是...

    链表

    单向链表,也称为单链表,其特点是每个节点只包含一个指向下一个节点的指针。在代码中,我们首先定义了一个`listnode`结构体,它包含了两个成员:`data`和`next`。其中`data`用于存储节点的实际数据,而`next`是一个...

    链表类(单向)

    总结一下,单向链表类的实现是数据结构和算法学习的重要组成部分。它提供了基础的增删改查功能,但缺乏类型检查,这在实际应用中可能需要改进。理解和掌握链表的运作原理对于深入理解计算机科学尤其是数据结构至关...

    c#单向链表的实现

    总结来说,C#中的单向链表是通过自定义的Node类和SinglyLinkedList类来实现的。Node类表示链表中的一个节点,包含数据和指向下一个节点的引用。SinglyLinkedList类提供了各种操作链表的方法,如添加、插入、删除和...

    单向链表实例

    ### 单向链表实例分析 #### 一、概述 本文档主要介绍了一个单向链表的实现案例,包括链表的基本操作如排序、插入、删除等。通过本实例,可以深入了解单向链表的数据结构及其在实际编程中的应用。 #### 二、代码...

    JAVA单向链表的实现.pdf

    ### JAVA单向链表的实现知识点详解 #### 一、链表基础概念 在深入了解Java单向链表的具体实现之前,我们首先需要了解链表的基本概念。链表是一种线性数据结构,它由一系列节点组成,每个节点包含两部分:数据域和...

    两列单向链表相同值查询设计

    ### 两列单向链表相同值查询设计 #### 概述 本篇文章将详细介绍如何设计并实现一个程序,该程序能构建两个单向链表,并根据第一个链表中的值来查询第二个链表中是否存在相同的值及其位置。该任务属于基础强化训练...

    实现单向链表Singlelist

    总结,这个“实现单向链表Singlelist”的源码提供了一个全面了解和实践链表操作的机会,同时展示了如何在C语言中优雅地使用函数指针。通过学习和分析这段代码,开发者可以增强对链表数据结构和函数指针的理解,提高...

    单向链表的逆转-详细讲解

    总结来说,逆转单向链表主要通过维护三个指针来实现:一个用于原链表,一个用于新链表,一个作为临时存储。通过改变指针的指向,我们可以将链表的顺序反转,从而实现逆转操作。这个过程不需要额外的内存空间,仅通过...

    C语言实现单向链表的创建、插入,删除节点,和2个链表合并

    总结,本篇文章介绍了C语言实现单向链表的基本操作,包括创建链表、插入节点、删除节点、判断链表是否有环以及合并两个已排序的链表。通过理解这些基本操作,可以为更复杂的数据结构和算法打下坚实的基础。在VC6.0...

    单向链表输入 遍历 及插入元素建立有序表

    根据给定的信息,本文将详细解释以下几个核心知识点:创建单向链表、遍历单向链表、在非递减有序链表中插入元素、逆置链表中的元素、合并两个非递减有序链表使其成为非递增有序链表以及如何将一个链表分解成两个链表...

    java 单链表和双向链表的实现

    总结起来,单链表和双向链表在Java中的实现涉及到节点类的设计和链表类的操作方法。单链表适用于简单、线性的数据访问,而双向链表则在需要双向遍历或频繁逆置的情况下更有优势。理解这些数据结构的原理和实现,对于...

Global site tag (gtag.js) - Google Analytics