赞
踩
单链表的完整的代码在这篇文章下面,链接:
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); }
以上就是单链表的一些基本操作,后续文章将介绍一些单链表稍复杂操作
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。