假设我有一个链接列表,例如1 -> 2 -> 3 -> 4 -> 5
。我想将这个链表从第一个元素拆分为m
th 元素,并从m+1
th 拆分到结尾,所以对于{{ 1}}我们有m=2
和1 -> 2
,类似这样:
3 -> 4 -> 5
我知道这不起作用,因为我对private ListNode split(ListNode head, int m) {
ListNode h1 = new ListNode(0);
ListNode h2 = new ListNode(0);
h1.next = head;
h2.next = head; // same reference: error!
ListNode cur1 = h1;
ListNode cur2 = h2;
for (int i = 0; i < m; i++) {
cur1 = cur1.next;
}
cur1.next = null;
ListNode tmp = cur2.next;
for (int i = 0; i < m; i++) {
tmp = tmp.next;
}
cur2.next = tmp;
// doesn't matter which one to return
return h2.next;
}
使用了相同的引用(head
),我需要复制一个头部(h2
),但是我想知道是否有一个更好,更有效的解决方案,而无需复制头部。
答案 0 :(得分:2)
我认为你只需要一个节点引用头
从头开始,如果修改“起始”列表,使n
- 节点指向null(从而“拆分”),则返回n+1
节点,该节点具有列表的其余部分。
我在想像这样的东西
private ListNode split(ListNode head, int m) {
ListNode tmp = head;
// Additionally check that you don't go beyond the list
for (int i = 0; tmp.next != null && i < m; i++) {
tmp = tmp.next;
}
ListNode remainder = tmp.next;
tmp.next = null;
return remainder;
}