链表
1.链表是以节点的方式存储,是链式存储
2.每个节点包含data域,next域(指向下个节点)
3.各个节点不一定是连续存储的,依靠next域来进行连接
4.链表分带头节点的链表和没有头节点的链表,根据实际的需要来确定
单向链表
缺点:查找的方向只能一个方向,只能从head方向一个一个遍历,删除节点时,需要找到前一个节点才能删除,不能自我删除
添加
普通增添数据
利用一个容器temp,找到链表最后位置,然后利用next域进行连接
按照编号添加,利用一个容器temp,找到添加位置的前一个节点,然后把添加节点的next域指向添加位置的前一个节点的next域heroNode.next=temp.next;,然后把前一个节点的next域指向添加节点temp.next=heroNode;
删除
找到但删除节点的前一个节点,然后把前一个节点的next域
指向删除节点的next节点也就是temp.next=temp.next.next;
修改
先找到修改的节点,然后把节点数据修改
遍历
输出节点后,把temp=temp.next,进行后移
查找链表倒数第N个节点
1.判断链表是否为空
2.校验N的取值,N不能小于等于0,N也不能大于链表长度
求链表长度(有效长度,除去head节点的长度):
1.判断链表是否为空,为空返回0
2.定义一个计数变量,遍历链表,每移动一次计数变量+1,直到移动到链表末尾,当前节点的next域为空时就到了链表末尾,遍历结束
3.循环遍历链表,倒数第N个,就需要移动(链表长度-N)次节点,比如链表长度为3,求倒数第三个节点,那么就移动0次,若求倒数第一个节点,那么就移动2个节点
链表倒序
1.判断链表是否为空,为空则不能翻转
2.定义变量,next存储当前节点的下个节点,reverseHead定义一个新链表头,cur当前节点
3.遍历原来链表,把当前节点取出,
保存下个节点next=cur.next,
把当前节点指向新链表的下个节点cur.next=reversetHead.next,
然后把当前节点的下个节点更新成当前节点
reversetHead.next=cur(完成了把当前节点插入新链表头部的操作)
最后节点后移
cur=next
4.把原来链表连接新链表翻转后的结果也就是head.next=reversetHead.next
链表从尾部到头部打印链表
法一
逆序链表后打印(会破坏原来链表的结构,不建议)
法二
利用栈的存储方式,先进后出的方式遍历节点然后存入栈中
双向链表
单向缺点:查找的方向只能一个方向,只能从head方向一个一个遍历,删除节点时,需要找到前一个节点才能删除,不能自我删除
双向链表可以向前或者向后查找
双向链表实现:
next指向后一个节点,pre指向前一个节点
遍历
和单链表一样,只是可以向前查找也可以向后查找
添加
1.末尾添加
先找到双向链表最后节点temp,找到后让temp.next=newNode(新节点),newNode.pre=temp;形成双向连接
2.按照编号添加
修改
和单链表一致
删除
因为是双向链表所有可以实现自我删除
待删除节点为temp,temp.next.pre=temp.pre;temp.pre.next=temp.next;
单向环形链表
约瑟夫环,丢手帕问题

浙公网安备 33010602011771号