LeetCode------rotate-list
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode------rotate-list相关的知识,希望对你有一定的参考价值。
题目:
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given1->2->3->4->5->NULLand k =2,
return4->5->1->2->3->NULL.
这道题说实话,确实花费了我很长的时间,题目的大致意思就是给定一个单链表,以及一个k
值,要做的是对于这个单链表我们从右向左数k个值,而后我们将这k个值挪到前面。
我在解答这一题的时候遇到下面两个问题:
(1)就是这里的k值的范围是否需要大于链表的长度,按照题目的意思,k值可以大于链表的长度,
可是如果大于了,又要怎么搞???
(2)就是在转化的过程中,TMD提交了好多次才成功。
啥也不说了,上代码(代码比较长,可能大家会有更好的方法,欢迎告知,相互学习!!!!)
1 public class Solution { 2 public ListNode rotateRight(ListNode head, int n) { 3 4 /* 5 这个判断不用说大家都理解吧 6 */ 7 if(head == null || n < 0 || head.next == null || n == 0) 8 { 9 return head; 10 } 11 /* 12 下面的这个循环就是就这个链表的长度的 13 */ 14 int len = 0; 15 ListNode node = head; 16 while(node != null) 17 { 18 len = len+1; 19 node = node.next; 20 } 21 /* 22 如果我们给定的n和链表的长度相等,我们可以在纸上画画试试,返回的也是链表的本身 23 */ 24 25 if(n == len) 26 { 27 return head; 28 } 29 /* 30 如下就是本题的核心部分了,首先我们先定义两个新链表head1和head2.head1用于指向前面的链表,head2用于指向 31 后面的链表。 32 也就是这样的: 33 比如,1->2->3->4->5->6->null,假如n=2,那么head1所指向的链表为:1->2->3->4 head2所指向的链表为:5->6 34 至于为什么要设定head1和head2,因为我在本题解中用到了链表的合并。 35 */ 36 ListNode head1 = new ListNode(-1); 37 ListNode head2 = new ListNode(-1); 38 ListNode pre = head;//定义pre用于指向链表的第一个节点。 39 /* 40 下面我们将n的取值分为两种情况,一个是当n>len的情况下的解决方法,还有一个就是n<len的解决方法, 41 这边我对于n>len的情况的解释是这样的,就是说当n>len的时候,我们从右向前开始数,当数到len个数的时候, 42 我们重新返回到该链表的尾部继续数。比如1->2->3->4->5->6->null,如果此时n=9,那么此时的head1所指向的链表为 43 1->2->3,head2所指向的链表为:4->5->6,就是这样子喽。 44 */ 45 /* 46 接下来开始进行n>len的情况的解释。 47 */ 48 if(n>len) 49 { 50 int m = n%len;//这一个大家应该很容易理解吧? 51 if(m == 0)//也就是说如果n的取值是len的整数倍,那么和n==0的情况下是一样的,返回的都是原链表。 52 { 53 return head; 54 }else 55 { 56 for (int i = 1;i< len-m;i++)//如果m != 0,需要做的就是利用for循环来寻找第len-m个节点, 57 { 58 pre = pre.next; 59 } 60 /* 61 接下来要做的就是拆分这两个链表,按照我前面所说的。同时在拆分之后,我们将前面链表的 62 最后一个节点的next指向为空。 63 */ 64 head1 = head; 65 head2 = pre.next; 66 pre.next = null; 67 ListNode current = head2; 68 /* 69 利用一个循环,找到后一个链表的最后一个节点 70 */ 71 while(current.next != null) 72 { 73 current = current.next; 74 } 75 current.next = head1;//找到后一个链表的最后一个节点之后,我们将这个节点的next指向前一个链表的头结点。 76 } 77 78 }else if(n < len) 79 { 80 /* 81 大同小异啦,和上面n>len的情况是一样的啦,理解了上面的,这点肯定会理解。 82 */ 83 for (int i = 1;i< len-n;i++) 84 { 85 pre = pre.next; 86 } 87 head1 = head; 88 head2 = pre.next; 89 pre.next = null; 90 ListNode current = head2; 91 while(current.next != null) 92 { 93 current = current.next; 94 } 95 current.next = head1; 96 } 97 return head2; 98 } 99 }
至此,该题的解决流程已经全部完成,如果大家有更好的方法,可以联系我。邮箱:[email protected] qq:764666877
以上是关于LeetCode------rotate-list的主要内容,如果未能解决你的问题,请参考以下文章