数据结构之单链表的删除,修改,遍历

单链表的完整的代码在这篇文章下面,链接:
https://blog.csdn.net/six_teen/article/details/113253545

上一篇文章已经介绍了单链表的插入(三种插入方法)https://blog.csdn.net/six_teen/article/details/113066700
这篇文章介绍一下单链表的基础操作之删除,修改,遍历。
首先是单链表的遍历:

遍历思路:
1)先判断链表是否为空,如果为空直接输出链表为空然后退出遍历方法,链表为空的条件是:head.getNext()==null,即头节点的下一个节点为空
2)单链表的所有操作都需要一个指针用来指向链表的节点,所以先创建一个节点指针并指向第一个节点:HeroNode cur = head.getNext();
3)用while循环遍历指针,此时的cur指向的是节点,退出循环的条件是当cur指针指向null时,即:cur==null

在这里插入图片描述
具体代码如下(代码还是在单链表类内部所以可以直接得到head):

public void print(){
    if (head.getNext()==null){
        System.out.println("链表为空");
        return;
    }
    HeroNode temp = head.getNext();
    while (true){//while循环结束,temp指向null
        if (temp==null){
            break;
        }
        System.out.println(temp);
        temp = temp.getNext();
    }
}

链表的修改思路:
1) 按序号修改节点信息,只能修改节点的其他信息不能修改序号,需要给方法传入一个节点node,节点包括要修改的信息和节点序号
2)先判断链表是否为空,如果为空直接输出链表为空然后退出修改方法,链表为空的条件是:head.getNext()==null,即头节点的下一个节点为空
3)先创建一个cur指针并指向第一个节点,HeroNode cur = head.getNext(),遍历链表找到要修改的节点,找到节点的条件:node.getNo==cur.getNo ,循环退出的条件有两个,一是cur指针指向null时,这也说明了没有要修改的节点。二是当cur指针指向的节点序号与传来的node节点序号一致,说明找到待修改节点,退出循环。

具体代码如下:

public void updateByNo(HeroNode node){
     if (head.getNext()==null){
         System.out.println("链表为空");
         return;
     }
     HeroNode temp = head.getNext();
     Boolean flag = false;//标识是否有此编号的节点
     while (true){
         if (temp==null){
             break;
         }
         if (temp.getNo()==node.getNo()){
             flag = true;
             break;
         }
         temp = temp.getNext();
     }
     if (flag){
         temp.setName(node.getName());
         temp.setNickname(node.getNickname());
     }else System.out.printf("没有编号%d的节点\n",node.getNo());
 }

该代码在遍历时先判断指针指向是否为空再判断指针指向节点的序号是否和传来的node节点序号一致,两个条件满足一个都退出循环,序号一致时给flag一个标识,退出循环后cur指向的就是待修改的节点或者是指向null,此时判断标识,如果标识flag为true就说明找到了。

按序号删除节点:
1) 删除节点的操作核心是要找到待删除节点的前一个节点,因为单链表是单向的,不能回退。
2)像遍历或者修改节点的操作类似,只不过定义的cur指针不能指向第一个节点,而是指向head节点,遍历链表时的退出条件是cur指针指向的下一个节点是否为空,或者cur指针指向的下一个节点序号等于待删除节点的序号
3)找到待删除节点的前一个节点之后,即cur指向待删除节点的前一个节点,此时让cur的next域指向其next域的next域,cur.setNext(cur.getNext().getNext())

public void removeByNo(int no){
    if (head.getNext()==null){
        System.out.println("链表为空");
        return;
    }
    HeroNode temp = head;
    boolean flag = false;//标识是否根据传来的no找到节点
    while (true){
        if (temp.getNext()==null){
            break;
        }else if (temp.getNext().getNo()==no){
            flag = true;
            break;
        }
        temp = temp.getNext();
    }
    if (flag){
        temp.setNext(temp.getNext().getNext());
    }else System.out.printf("没有编号%d的节点\n",no);

}

在这里插入图片描述

以上就是单链表的一些基本操作,后续文章将介绍一些单链表稍复杂操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值