链表

链表

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;

单向环形链表

约瑟夫环,丢手帕问题

约瑟夫问题:设编号1,2,3......n个人坐着围成一圈,约定编号为K(k在1到n之间)的人从一开始报数,数到m的哪个人出列,它的下一位又从1开始,数到m的那个人又出列,直到所有人出列为止,产生一个出对编号的序列

posted @ 2022-04-11 20:04  lenao  阅读(129)  评论(0)    收藏  举报