首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >截断链表的递归解决方案

截断链表的递归解决方案
EN

Stack Overflow用户
提问于 2021-10-13 00:45:08
回答 2查看 38关注 0票数 1
代码语言:javascript
复制
public class Solution {

  /**
   * Return a list containing, at most, the first numNodes nodes in the list starting with head. If
   * numNodes is larger than the length of the list, then the entire list will be returned.
   * 
   * Examples:
   * 
   * <pre>
   * [11, 12, 13], numNodes = 2
   * returns [11, 12]
   * 
   * [11, 12, 13], numNodes = 0
   * returns []
   * 
   * [11, 12, 13], numNodes = 100
   * returns [11, 12, 13]
   * 
   * [], numNodes = 5
   * returns []
   * </pre>
   * 
   * @param head - Head of the list to truncate
   * @param numNodes - Maximum number of nodes in the resulting list
   * @return head of the truncated list
   */
  public static ListNode truncate(ListNode head, int numNodes) {
    // just return null
    if (head == null) {
      return null;
    }
    // Recursion head.next
    if (head.next != null) {
      head.next = truncate(head.next, numNodes--);
    }
    
    if (numNodes <= 0) {
      return head.next;
    } else {
      return head;
    }
  }

如您所见,此代码的目的是截断通过numNodes的每个节点。除了传递长度为4的列表,并且我需要返回前3个节点(numNodes= 3)之外,我还通过了所有测试。如果有人能帮我一把,我将不胜感激。我不知道我做错了什么。

下面是ListNode类

代码语言:javascript
复制
/**
 * Simple Singly-linked-list node.
 */
public class ListNode {

  public int val;
  public ListNode next;

  public ListNode(int val, ListNode next) {
    this.val = val;
    this.next = next;
  }

  public ListNode(int val) {
    this.val = val;
    this.next = null;
  }

  public ListNode() {
    this.val = 0;
    this.next = null;
  }
}

这是我唯一失败的测试

testTruncateLengthFourListToThree()预期: 10,11,12实际: 10,11,12,13

解决方案必须是递归的。

EN

回答 2

Stack Overflow用户

发布于 2021-10-13 01:08:58

尝尝这个。

代码语言:javascript
复制
record ListNode(int val, ListNode next) {}

public static ListNode truncate(ListNode head, int numNodes) {
    if (head == null || numNodes <= 0)
        return null;
    else
        return new ListNode(head.val, truncate(head.next, numNodes - 1));
}

public static String toString(ListNode head) {
    List<String> list = new ArrayList<>();
    for ( ; head != null; head = head.next)
        list.add("" + head.val);
    return list.toString();
}

public static void main(String[] args) {
    ListNode list = new ListNode(1, new ListNode(2, new ListNode(3, null)));
    System.out.println("list = " + toString(list));
    System.out.println("truncate(list, 3) = " + toString(truncate(list, 3)));
    System.out.println("truncate(list, 2) = " + toString(truncate(list, 2)));
    System.out.println("truncate(list, 1) = " + toString(truncate(list, 1)));
    System.out.println("truncate(list, 0) = " + toString(truncate(list, 0)));
}

输出:

代码语言:javascript
复制
list = [1, 2, 3]
truncate(list, 3) = [1, 2, 3]
truncate(list, 2) = [1, 2]
truncate(list, 1) = [1]
truncate(list, 0) = []
票数 0
EN

Stack Overflow用户

发布于 2021-10-13 01:14:57

也许您可以在递归调用中使用前缀增量而不是后缀来截断,将truncate(head.next,numNodes--)改为truncate(head.next,-- numNodes ),以便在递归之前递减numNodes。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69548455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档