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的主要内容,如果未能解决你的问题,请参考以下文章