c语言双向链表增删改查,双向链表的增删改查和反向遍历

双向链表的增删改查和反向遍历

双向链表的增删改查和反向遍历

双向链表:一个节点中既有上一个节点的内存地址又有下一个节点的内存地址,还有数据域

首先:我们需要一个节点类来展示节点信息:

class HNode{

public String name;

public int no;//根据这个编号来查找,修改,删除,添加元素

public HNode next;//下一个节点的信息

public HNode pre;//上一个节点的信息

public HNode(String name, int no) {

this.name = name;

this.no = no;

}

@Override

public String toString() {

return "姓名" +

name + '\'' +

"编号" + no

;

}

}

接下来创建一个双向链表类来实现增删改查

class TwoWayLinkedList{

HNode head=new HNode("",0);//定义一个空的头结点

接下来就是增删改操作了,关于实现的一些细节在代码注释里了

public void add(HNode newHNode){

HNode temp=head;//头节点不能移动,用一个temp指针来遍历双向链表

while(true)

{

if(temp.next==null)//找到了最后

{

break;

}

temp=temp.next;

}

temp.next=newHNode;//最后一个节点的下一个节点就是新加的节点

newHNode.pre=temp;//新的节点的前一个节点就是temp

}

来张图可能更好理解一些

4f281f0e81e12671e4867e92d25c93fc.png

public void addByNo(HNode newHNode){

HNode temp=head;

boolean flag=false;//判断条件

while(true)

{

if(temp.next==null)

{

break;

}

if(newHNode.no

{

break;

}

if(newHNode.no==temp.next.no)

{

flag=true;//如果编号重复就标记一下

break;

}

temp=temp.next;

}

if(flag)

{ System.out.println("编号重复,添加失败~~");

}

else{

newHNode.next=temp.next;//新节点的下一个节点为temp的下一个节点

temp.next=newHNode;//temp的下一个节点为新的节点,相当于中间插入了一个节点

}

}

//修改元素,通过no定位

public void modify(int no,String name){

HNode temp=head;

boolean flag=false;

if(temp.nextnull)

{

System.out.println(“链表已空修改失败”);

return;

}

while(true)

{

if(temp.nono)

{

break;

}

if(temp.next==null){

flag=true;

break;

}

temp=temp.next;

}

if(flag){

System.out.println(“没有找到要修改的元素呢”);

}

else {

temp.name=name;

}

}

//显示元素

public void show(){

HNode temp=head;

if(head.next==null)

{

System.out.println("链表为空!");

return ;

}

while(true)

{

if(temp.next==null)

{

break;

}

System.out.println(temp.next);

temp=temp.next;

}

}

//从尾到头遍历

public void showByReverse(){

HNode temp=head;

HNode temp2;

while(true)

{

if(temp.next==null)

{

temp2=temp;

break;

}

temp=temp.next;

}

while(true)

{

if(temp2.pre==null)

{

break;

}

System.out.println(temp2);

temp2=temp2.pre;

}

}

90342c7f4fc2aaac681e642c4a8ae023.png

a2413f1b6b9cabec8d347a86b5bdc78b.png

1cf59db12346dedcbb63fba76b5ba7ac.png

389dcd3f0418bf8161113c64e1aeed9c.png

双向链表的增删改查和反向遍历相关教程

SQLAlchemy -orm、Flask数据库的增删改查、sqlalchemy 常用数据

SQLAlchemy -orm、Flask数据库的增删改查、sqlalchemy 常用数据类型、 column常用参数和聚合函数 使用orm创建表格 连接数据库 创建Base基类 创建类,添加属性,添加数据类型约束 创建session 添加创建实例添加数据 添加数据到数据库 提交数据 def add_data():

237. 删除链表中的节(python)力扣

237. 删除链表中的节(python)力扣 解题:我们要删掉的就是node:A,怎么删掉该节点呢,无法直接删除节点A,可以用后面的B把这个node覆盖掉,然后用它的下下个地址node C来作为node A的下一个地址,其实是要删掉的节点被覆盖了B的值苟且偷生,真正删掉的却是

剑指offer第52题 两个链表的第一个公共节点

剑指offer第52题 两个链表的第一个公共节点 文章目录 问题描述: 解题思路: 代码实现: 问题描述: 输入两个链表,找出它们的第一个公共节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,

双向循环链表(C语言实现)

双向循环链表(C语言实现) 双向循环链表 我们知道单链表对于最后一个元素的删除和插入是很不方便的,需要一直遍历到最后一个元素才行,而双向循环链表只需要找到,头节点的上一个元素的地址即可 双向循环链表中每一个元素块都有两个指针prev和next,prev连接它

数据结构45:树的链表实现

数据结构45:树的链表实现 实现树:节点链接法 同样可以用 节点链接法 实现树 每个节点保存根节点的数据项,以及指向左右子树的链接 定义一个BinaryTree类,成员key保存根节点的数据项,成员left/rightChild则保存指向左/右子树的引用(同样是BinaryTree对象

【剑指offer】06. 从尾到头打印链表

【剑指offer】06. 从尾到头打印链表 题目描述 力扣 牛客 // 输入一个链表的头节点,从尾到头反过来返回每个节点// 的值(用数组返回)。 题解 牛客 // 逐元素存储// 时间复杂度:14ms// 空间复杂度:9524KBimport java.util.ArrayList;import java.util.Colle

Flask-sqlalchemy增删改查之(查询数据)

Flask-sqlalchemy增删改查之(查询数据) sqlalachemy 的查询语法较多,我们接下来可以通过一个案例来进行综合演练 案例说明: 案例中包含一个模型类 User, 对应 users表, 包含四个字段: id(主键), name, email, age 首先运行案例代码, 生成测试数据 程序启动

剑指 Offer 25. 合并两个排序的链表

剑指 Offer 25. 合并两个排序的链表 LeetCode: 剑指 Offer 25. 合并两个排序的链表 遍历两条链表,比较两条之间谁的值更小,那么当前节点 node 的 next 就指向 更小的那个节点, 为了方便根据值直接new ListNode(int val)了。 直到其中一条/或两条都遍历完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值