【数据结构】线性表(二)

简介: 【数据结构】线性表

2.3.3 类定义


  • 数据域 data:用于存放数据元素的值。
  • 指针域 next:用于存放后继结点的地址。
publicclassNode{
publicObjectdata;             //数据域publicNodenext;               //指针域}

2.3.4 算法:单链表的长度【重点】


publicintlength() {
Nodep=head.next;                 // 获得第一个结点intlength=0;                     // 定义一个变量记录长度while(p!=null) {
length++;                      //计数p=p.next;                     //p指向下一个结点    }
returnlength;
}

2.3.5 算法:按索引号(位序号)查找【重点】


  • 思路:
  • 处理了所有的结点都没有数据,判断依据 null
  • 处理到一部分就找到了,判断依据
publicObjectget(inti) {
Nodep=head.next;             //获得头结点intj=0;                      //已经处理的结点数while(p!=null&&j<i) {     //链表没有下一个 && 处理有效部分p=p.next;
j++;
    }
if(i<0||p==null) {
thrownewException("元素不存在");
    }
returnp.data;                  //返回数据}

2.3.6 算法:按值查找索引号【重点】


//查询给定值的索引号,如果没有返回-1publicintindexOf(Objectx) {
Nodep=head.next;         // 获得头结点intj=0;                  // 不匹配元素的个数while(p!=null&&!p.data.equals(x)) { // 循环依次找【不匹配】元素p=p.next;
j++;
    }
// 返回匹配索引,如果没有返回-1if(p!=null) {
returnj;
    } else {
return-1;
    }
}

2.3.7 算法:插入


  • 需求:向索引i前面插入一个新结点s
  • 思路:获得i的前驱,结点P
publicvoidinsert(inti , Objectx) {
Nodep= ...;               // 获得i前驱,结点pNodes=newNode(x);       //创建新结点ss.next=p.next;            //必须先执行p.next=s;                 //然后再执行}

image.png

2.3.8 算法:删除


  • 需求:删除i结点

image.png

publicvoidremove(inti) {
// 获得i的前驱结点pp.next=p.next.next;
}

2.3.9 算法:获得前驱


// i最小值0,表示获得头结点head// 算法内部,使用-1表示头结点head,结点移动从头结点head开始。publicvoidprevious(inti) {
Nodep=head;              //从头结点head开始移动intj=-1;                 //使用-1表示头结点的索引while(p!=null&&j<i-1 ) {      // i-1前驱的下标p=p.next;
j++;
    }
if(p==null||i<0) {   // i-1 < jthrownewRuntimeException("i不合法");
    }
//p就是需要获得前驱}

2.4 循环链表


2.4.1 定义


  • 循环链表也称为环形链表,其结构与单链表相似,只是将单链表的首尾相连。

image.png

// p结点是尾结点

p.next = head;

2.4.2 算法:循环链表合并


  • 分析

image.png

核心算法/* 变量a尾: tailaa头:taila.nextb尾:tailbb头:tailb.next*/// 先将b尾指向a的头,需要定义p记录b尾原来的值// 再将a的尾指向b的头Nodep=tailb.next;            //记录b尾的指向,也就是b头tailb.next=taila.next;        //b尾指向a头taila.next=p.next;            //a尾执行b头

2.5 双向链表


2.5.1 定义


  • 一个结点由两个指针域,一个指针域指向前驱结点,另一个指针域指向后继结点,这种链表称为双向链表
  • 数据域 data
  • 前驱结点指针域:prior
  • 后继结点指针域:next

image.png

2.5.2 算法:插入


  • 需求:向结点p前面插入新结点s

image.png

/* 变量结点a:p.prior*/p.prior.next=s;       //结点a指向结点ss.prior=p.prior;      // 结点s指向结点ap.prior=s;            //结点p指向结点ss.next=p;             //结点s执行结点p//注意:必须先处理结点a,否则无法获得结点a

2.5.3 算法:删除


  • 需求:删除p结点

image.png

// a.next = bp.prior.next=p.next;
// b.prior = ap.next.prior=p.prior
相关文章
|
5月前
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
126 2
|
1月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
29 6
|
12天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
21 1
|
5月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
46 0
|
1月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
53 0
|
1月前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
33 0
|
2月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
5月前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
59 5
|
5月前
|
存储 测试技术
【数据结构】操作受限的线性表,队列的具体实现
【数据结构】操作受限的线性表,队列的具体实现
44 4
下一篇
无影云桌面