//带头结点的单链表类
//建议,不声明成员变量rear和n,不安全,维护困难,子类需要同时修改3个成员变量,易出错。
package dataStructure.linearList;
import dataStructure.linearList.Node; //导入单链表结点类
import java.util.Iterator; //导入迭代器接口
public class HSLinkedList<E> extends AbstractList<E> implements LList<E> //带头结点的单链表类,实现线性表接口
{
protected Node<E> head; //头指针,指向单链表的头结点
protected Node<E> rear; //尾指针,指向单链表最后一个结点
protected int n; //单链表长度
public HSLinkedList() //构造空链表
{
this.head = new Node<E>(); //创建头结点,值为null
this.rear = this.head;
this.n=0;
}
public boolean isEmpty() //判断单链表是否为空,O(1)
{
return this.head.next==null;
}
public int length() //返回单链表长度,O(1)
{
return this.n;
}
public E get(int index) //返回序号为index的对象,index初值为0
{ //若单链表空或序号错误返回null,O(n)
if (index>=0)
{
int j=0;
Node<E> p=this.head.next;
while (p!=null && j<index)
{
j++;
p = p.next;
}
if (p!=null)
return (E)p.data;
}
return null;
}
public E set(int index, E element) //设置序号为index的对象为element,O(n)
{ //若操作成功返回原对象,否则返回null
if (index>=0 && element!=null)
{
int j=0;
Node<E> p=this.head.next;
while (p!=null && j<index)
{
j++;
p = p.next;
}
if (p!=null)
{
E old = (E)p.data;
p.data = element;
return old; //若操作成功返回原对象
}
}
return null; //操作不成功
}
public boolean add(E element) //在单链表最后添加对象,O(1)
{
if (element==null)
return false;
this.rear.next = new Node<E>(element); //尾插入
this.rear = this.rear.next; //移动尾指针
this.n++;
return true;
}
public boolean add(int index, E element) //在指定位置插入非空的指定对象
{ //若操作成功返回true,O(n)
if (element==null)
return false;
if (index>=this.n)
return this.add(element); //插入在最后
else
{
int j=0;
Node<E> p = this.head;
while (p.next!=null && j<index) //若index<=0,插入在头结点之后
{
j++;
p = p.next;
}
p.next=new Node<E>(element, p.next); //插入在p结点之后,包括头插入、中间插入
this.n++;
return true;
}
}
public E remove(int index) //移去index位置的对象,O(n)
{ //若操作成功返回被移去对象,否则返回null
E old = null;
if (index>=0) //头删除、中间/尾删除
{
int j=0;
Node<E> p=this.head;
while (p.next!=null && j<index) //定位到待删除结点的前驱结点
{
j++;
p = p.next;
}
if (p.next!=null)
{
old = (E)p.next.data;
if (p.next==this.rear)
this.rear=p;
p.next = p.next.next; //删除p的后继结点
this.n--;
}
}
return old;
}
public void clear() //清空单链表,O(1)
{
this.head.next = null;
this.rear = this.head;
this.n=0;
}
public String toString() //返回显示单链表所有元素值对应的字符串
{ //单链表遍历算法,O(n)
String str="(";
Node<E> p = this.head.next;
while (p!=null)
{
str += p.data.toString();
p = p.next;
if (p!=null)
str += ", ";
}
return str+")";
}
//以上实现LList接口
public Iterator<E> iterator() //返回一个迭代器对象
{
return new Itr();
}
private class Itr implements Iterator<E> //私有内部类,实现迭代器接口
{
private Node<E> cursor = head.next;
public boolean hasNext() //若有后继元素,返回true
{
return cursor!=null && cursor.next!=null;
}
public E next() //返回后继元素
{
if (cursor != null && cursor.next!=null)
{
E element = cursor.next.data;
cursor = cursor.next;
return element;
}
return null;
}
public void remove() //不支持该操作
{
throw new UnsupportedOperationException();
}
}//内部类Itr结束
public static void main(String args[])
{
HSLinkedList<String> list = new HSLinkedList<String>();
for (int i=5; i>=0; i--)
list.add(0,new String((char)('A'+i)+""));
System.out.println(list.toString());
}
}
/*
程序运行结果如下:
(A, B, C, D, E, F)
*/
分享到:
相关推荐
### 带头结点单链表的基本操作详解 #### 引言 单链表是数据结构中的一个重要概念,尤其在计算机科学与编程领域中应用广泛。带头结点的单链表是在链表的最前端添加一个额外的节点,这个节点不存储实际的数据,其作用...
使用C++面向对象的方法实现带头结点的单链表的插入,删除等基本操作.
不带头结点单链表.cpp
/*在带头结点的单链表第i个位置后插入一个数*/ node *insert(node *head,int i,datatype x) { node *p,*q; q=find(head,i); if(!q) { printf("插入的位置不存在!\n");return head;} else { p=(node *)...
实现单链表及其一些基本操作函数(不带头结点) 1.头文件包含 2.宏定义及节点类型描述 3.初始化、判断是否为空 4.指定位置插入操作 5.在p节点后插入元素e 6.在p节点前插入元素e 7.删除操作:删除第i个节点,...
下面将详细解释如何用C++实现不带头结点单链表的基本操作,包括逆序建立链表、插入元素以及删除元素。 首先,我们需要定义链表节点的结构体,如下: ```cpp struct ListNode { int data; ListNode* next; }; ```...
本压缩包“带头结点单链表.zip”提供的内容着重于如何在实际编程中实现带有头结点的单链表。 首先,我们需要理解单链表的基本概念。单链表是由一系列节点构成的,每个节点包含两部分:数据域和指针域。数据域用于...
以上就是带头结点单链表的基本定义和操作。这些操作构成了链表操作的基础,可以在此基础上扩展出更复杂的算法和数据结构。通过理解并实现这些基本操作,可以加深对链表和数据结构的理解,提高编程技能。在实际编程中...
本文档详细阐述了如何利用带头结点的单链表来实现两个集合的并集、交集和差集运算。 首先,在题目重述部分,我们明确了解决问题的目标,即通过带头结点的单链表结构来构建并、交、差运算的具体实现。头结点的存在是...
在这个主题中,我们重点关注不带头结点的单链表,以及如何用C++来实现它的遍历、插入、查询和删除功能。 首先,不带头结点的单链表意味着链表的第一个元素就是链表本身,没有额外的节点用于标识链表的起始位置。这...
给定一个不带头结点的单链表,写出将链表倒置的算法
1.若干城市的信息存入一个带头结点的单链表,结点中的城市信息包括城市名、城市的位置坐标。要求: (1)给定一个城市名,返回其位置坐标。 (2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。
使用尾插法建立一个带头结点的单链表,然后输出结果
1.顺序表的验证 (1)定义一个结构体,描述学生信息。学生信息包括:学号、姓名、性别、班级和电话... (2)修改带头结点的单链表类模板中的插入函数,插入元素时按元素值从小到大的顺序插入数据元素到链表的适当位置。
### 带头结点的单链表存储结构与基本操作 #### 一、概述 在计算机科学领域,数据结构是研究数据组织方式及其运算的重要工具。其中,单链表是一种常见的线性表存储结构,它通过一组节点来表示一个序列,每个节点...
当我们谈论“带头结点”的单链表时,意味着在链表的第一个元素前还有一个特殊的节点,称为头结点。头结点不包含实际数据,而是用作链表的起点,并简化了对链表的操作。 在C语言中,实现带头结点的单链表涉及以下几...
使用C语言实现单链表的实验 1、有学生信息(姓名、学号、成绩),用链式存储实现带头结点单链表; 2、插入新学生相关信息; 3、删除学生相关信息; 4、查找学生相关信息; 5、修改学生信息;
将带头结点的单链表实现线性表的功能
带头结点的单链表类的定义及实现1.cpp .........
带头结点的单链表,将其翻转,输出。typedef struct lnode { int data; struct lnode *next;/*指针域*/ } lnode,*linklist; /**linklist表示struct lnode类型的指针;lnode是别名*/