我如何用java編寫一個函數,通過將一個單鏈表分成兩半來反轉它,這意味著第一部分有(n/2)個節點,其余部分是第二部分(n是喜歡的列表的大?。?,直到它到達一個節點,然后合并這個分開的部分。在每個除法中允許使用兩個新的鏈接列表,但不允許使用列表節點。函數必須為void,并且函數沒有參數。我有n,頭和尾的主鏈接列表。
我在網站上找到了這個代碼,但是它沒有把鏈表分成兩半,所以它沒有幫助。
static ListNode reverseR(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode first = head;
ListNode rest = head.next;
// reverse the rest of the list recursively
head = reverseR(rest);
// fix the first node after recursion
first.next.next = first;
first.next = null;
return head;
}
因為您使用的是鏈接列表,所以您建議的方法不太可能有效。確定中點的位置是一個線性時間操作,即使列表的大小是已知的,您仍然需要迭代到中點。因為在遞歸樹的每個節點上都有一個線性項,所以總體性能將是O(n lgn),比您提供的代碼的O(n)界慢。
盡管如此,你仍然可以通過以下策略來扭轉這個列表:
你可以看到,首先,我們的列表是AB,然后遞歸得到A'和B',每個都是半列表的反向版本。然后輸出新的反向列表B'A'。原始A的第一個元素現在是整個列表的最后一個元素,而原始B的最后一個元素現在是整個列表的第一個元素。