右移K位的过程就是按后K位和剩余位分成两部分,分别逆序排列然后把整个數组逆序排列。
变换过程通过以下步骤完成:
方法1:将单链表储存为数组然后按照数组的索引逆序进行反转。
方法2:使用三个指针遍历單链表逐个链接点进行反转。
方法3:从第2个节点到第N个节点依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾
方法1的问题是浪费空间。方法2和方法3效率相当一般方法2较为常用。
从头指针开始每次分别移动2、1个节点
每遍历到一个新节点,就用噺节点和HashSet集合当中存储的节点作比较如果发现HashSet当中存在相同节点ID,则说明链表有环如果HashSet当中不存在相同的节点ID,就把这个新节点ID存入HashSet
快慢指针法 若无环,快指针先为空
p1和p2分别都是head指针先将p2向右移动k次。(此时k为2)
只需要继续保持p1和p2等间距的右移当p2的next为null,则证明p1所指的结点的值为倒数第k个节点的值
建立两个指针一个指针一次遍历两个节点,另一个节点一次遍历一个节点当快指针遍历到空节点时,慢指针指向的位置为链表的中间位置
对于两个没有环的链表楿交于一节点,则在这个节点之后的所有结点都是两个链表所共有的如果它们相交,则最后一个结点一定是共有的则只需要判断最后┅个结点是否相同即可。时间复杂度为O(len1+len2)
对于相交的第一个结点,则可求出两个链表的长度然后用长的减去短的得到一个差值 K,然后让長的链表先遍历K个结点
还可以这样:其中一个链表首尾相连,检测另外一个链表是否存在环如果存在,则两个链表相交而检测出来嘚依赖环入口即为相交的第一个
(1)next[0]= -1,任何串的第一个字符的模式值规定为-1
(2)next[j] = -1模式串t中下标为j的字符,如果与首字符相同前k个字符不等或者楿等但t[j]
(3)next[j] = k,模式串t中下标为j的字符如果前k个字符相等,且t[j]
设在字符串S中查找模式串T若S[m]!=T[n],那么取T[n]的模式函数值next[n]
但k<n,表示S[m]的前k个字符与T中嘚开始k个字符已经间接比较相等了,下一次比较S[m]和T[k]相等吗
入队时,直接压入stack1中
出队时判断stack2是否为空,如果stack2为空则将stack1中的元素倒入stack2中,否则直接弹出stack2中的元素
入栈时直接压入queue1中
出栈时,先将queue1中的元素除最后一个元素外依次出隊列并压入队列queue2中,将留在queue1中的最后一个元素出队列即为出栈元素最后还要把queue2中的元素再次压入queue1中
13.根节点到指定節点的路径
如果结点中有一个指向父结点的指针,我们可以把问题转化为求两个链表的共同结点
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。