题目描述:给定一个链表,旋转链表使得每个节点向右移动k个位置,其中k为非负数示例:给定一个链表1->2->3->4->5->null且k=2;return4->5->1->2->3->null首先观察本题的目的。其实换句话说,你可以这样描述:给定一个k值,将链表中倒数第k个节点的部分移动到链表的最前面。例子中实际上是将4->5部分移到整个链表的最前面,变成4->5->1->2->3->null。不过需要注意的是,题目中并没有给出k的大小。当k大于链表长度时,我们需要用k求链表长度的余数。比如k=7,那么上面的例子还是将4->5移动到整个链表的最前面。所以,这道题的思路可以概括为:1.先求出整个链表的长度2.根据k值求出链表中需要移动的部分的前驱(3在例子中)3.断开前导后的链表,移动后半部分代码如下:#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,x):#self.val=x#self.next=NoneclassSolution:#@paramhead:thelist#@paramk:rotatetotherightkplaces#@return:thelistafterrotationdefrotateRight(self,head,k):ifheadisNone:returnheadcur=headcount=1#计算链表长度whilecur.next:curcur=cur.nextcount+=1#为了节省代码,这里有一个很巧妙的处理:使用尾节点链接头节点cur.next=head#这里,k是cur从尾节点到前驱需要走的步数要断开的部分k=count-k%count#找到前驱whilek!=0:curcur=cur。nextk-=1#Disconnecthead=cur.nextcur.next=None#因为head和tail已经连起来了,可以直接返回到前驱后面的节点,这里引用为headreturnhead#writeyourcode,这里需要交注意第21行头尾连接的技巧,大大节省了我们的代码量。其实按照前面思路描述的步骤是没有问题的。不过这个技巧真的很酷,值得学习。具体细节我写在代码注释里了。
