【问题标题】:C programming splliting linked list into halfC编程将链表分成两半
【发布时间】:2015-10-31 15:41:29
【问题描述】:

在 C 编程中尝试将链表分成两半时遇到了一些问题。代码如下:

typedef struct _listnode {
    int item;
    struct _listnode *next;
} ListNode;         // You should not change the definition of ListNode

typedef struct _linkedlist {
    int size;
    ListNode *head;
} LinkedList;   

}

【问题讨论】:

  • SplitLinkedList 不应返回 -1,因为它是无效的
  • 哎呀,这是个错误。任何想法为什么它会这样?
  • 通常,这是使用两个指向节点的指针来完成的。一个指针一次前进两个节点,一次前进一个节点。然后一个时间指针的两个节点到达链表的末尾,一个时间指针的一个节点在链表的中间。
  • @rcgldr 我很困惑。你介意给我提供一些我可以参考的代码示例吗?
  • @rcgldr 你好有什么想法吗?

标签: c pointers linked-list nodes


【解决方案1】:

您没有这么说,但我假设当您将列表一分为二时,您不想保留原始列表。如果是这样,您只需要找到切断链接的位置,例如:

head1 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> NULL     head2 -> NULL

head1 -> 1 -> 2 -> 3 -> NULL     head2 -> 4 -> 5 -> 6 -> NULL

这里,你必须在示例节点3中识别第一个loist的新尾部tail。将新列表的头部设置为tail->next,将tail->next设置为NULL并调整计数在您的列表中。

您的代码中的奇数和偶数不需要不同的分支。如果列表具有奇数个节点,则一个列表将比另一个多一个节点:left = total / 2 将使右侧列表更长,left = (total + 1) / 2 将使左侧列表更长。只需选择一个即可完成。

【讨论】:

  • 但是我不能改变链表和链表节点的结构。任何想法如何解决这一问题?我认为这是因为我正在更新我的头指针?而对于刚刚选择并完成的,你是什么意思?对不起,我很困惑
  • 我的答案不需要更改列表或节点的结构。顺便说一句,您泄漏了已删除节点的内存。我的方法更简单、更快捷。
  • 但我以为你用的是tail? Tail 是 LinkedList 结构的一部分,对吧?
  • @MOegm 你好有什么想法吗?
  • @IWasSoLost 我认为您遇到的问题是了解内存中的列表并概念化此解决方案的作用。节点只不过是内存中给定类型的结构。它仅通过一些指向它的 next 指针和指向其他东西的 next 指针与列表相关联。此解决方案只不过是将node3->next 更改为NULL 并将head2->next 更改为node4 的地址。这是拆分列表的正确方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2013-05-25
  • 2013-12-06
  • 2012-05-26
相关资源
最近更新 更多