【问题标题】:Given the head of a linked list, rotate the list to the right by k places. What am I doing wrong?给定链表的头部,将链表向右旋转 k 位。我究竟做错了什么?
【发布时间】:2021-07-11 22:56:44
【问题描述】:

我正在尝试此代码,但由于某种原因,它不起作用。有人可以告诉我我做错了什么。 我知道这个平台的所有地方都已经发布了正确的代码,我只是想知道我的代码有什么问题。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        
        for(int i=0;i<k;i++){
            ListNode temp=head;
            ListNode last=head;
            
            while(temp.next!=null){
                if(temp.next.next==null) last=temp;
                temp=temp.next;
            }
            
             ListNode dummy=new ListNode(temp.val);
             dummy.next=head;
             last.next=null;
                  
        }
        return head;
                
    }
}

【问题讨论】:

  • 旋转“右”和“左”意味着在空间中上升或下降。

标签: java linked-list


【解决方案1】:

我只是想知道我的问题是什么

您有 2 个嵌套循环这一事实是错误的,您创建一个新的 ListNode 对象这一事实是错误的,因此您的代码的整个概念都是错误的。

考虑一下。把它画在纸上。

假设向右旋转意味着值似乎向右移动,那么例如在 9 长的列表上向右旋转 3,您会得到:

 1 2 3 4 5 6 7 8 9
         │
         │ Move 3 right
         ↓
 7 8 9 1 2 3 4 5 6

如果您查看next 链接的更改,您会发现您只需要进行 3 次更改,就大功告成了:

 head
   ↓                                        BEFORE
   1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9

                         head
                           ↓
┌→ 1 → 2 → 3 → 4 → 5 → 6   7 → 8 → 9 ─┐     AFTER
│                                     │
└─────────────────────────────────────┘

采取的行动:

  • 找到节点“6”(newTail)和最后一个节点(tail
  • 更新最后一个节点以指向第一个节点 (tail.next = head)
  • 新的头将是 next 值 (newHead = newTail.next)
  • 清除next 值(newTail.next = null

只有第一个动作是一个循环,因此您有 2 个 嵌套 循环这一事实并不是正确的解决方案。即使您不知道列表长度,也可以使用单个循环来完成,尽管您可以使用 2 个单独(非嵌套)循环对其进行编码。

完全没有必要为此创建一个新的ListNode 对象。

【讨论】:

  • 这是一个很好且解释清楚的答案。
【解决方案2】:

当您将dummy.next 设置为head 时,dummy 现在是列表的开头。所以你应该设置head = dummy。如:

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null || head.next == null){
            return head;
        }
        for(int i=0;i<k;i++){
            ListNode temp=head;
            ListNode last=head;
            
            while(temp.next!=null){
                if(temp.next.next==null) last=temp;
                temp=temp.next;
            }
            
             ListNode dummy=new ListNode(temp.val);
             dummy.next=head;
             last.next=null;
             head = dummy;
     
        }
        return head;
                
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2016-07-18
    • 2015-12-02
    • 1970-01-01
    • 2017-07-27
    • 2019-12-23
    相关资源
    最近更新 更多