通過在每次循環中將鏈表分為兩半,遞歸地反轉單鏈表

我如何用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)界慢。

盡管如此,你仍然可以通過以下策略來扭轉這個列表:

 Step 1: Split the list L into A (the first half) and B (the second half).
 Step 2: Recurse on each of A and B. This recursion should bottom out 
         when given a list of length 1.
 Step 3: Attach the new head of the reversed A to the new tail of the reversed B.

你可以看到,首先,我們的列表是AB,然后遞歸得到A'和B',每個都是半列表的反向版本。然后輸出新的反向列表B'A'。原始A的第一個元素現在是整個列表的最后一個元素,而原始B的最后一個元素現在是整個列表的第一個元素。

主站蜘蛛池模板: 国产一区在线mmai| 国产av一区最新精品| 天天爽夜夜爽人人爽一区二区| 中文字幕一区二区在线播放| 国精产品一区一区三区有限公司| 日本一区二区免费看| 日韩精品免费一区二区三区 | 国产成人无码AV一区二区在线观看| 亚洲乱码一区二区三区国产精品| 亚洲老妈激情一区二区三区| 麻豆视传媒一区二区三区| 无码人妻精一区二区三区| 久久精品一区二区三区AV| 香蕉免费一区二区三区| 久久99国产精一区二区三区| 久久无码一区二区三区少妇| 杨幂AV污网站在线一区二区| 国产免费av一区二区三区| 国产精品一区二区三区久久| 免费高清在线影片一区| 国产视频一区在线播放| 日本精品高清一区二区2021| 国产精品亚洲一区二区三区在线观看 | 国产乱码一区二区三区| 亚洲天堂一区在线| 亚洲日韩国产一区二区三区在线 | 久久久久国产一区二区三区| 亚洲国产一区明星换脸| 国产波霸爆乳一区二区| 国产精品视频一区二区噜噜| 亚洲高清美女一区二区三区| 亚欧免费视频一区二区三区| 一区国产传媒国产精品| 国产精品亚洲一区二区三区 | 一区二区三区四区在线视频| 国产精品一区二区三区99| 夜夜添无码一区二区三区| 精品一区精品二区制服 | 亚洲av无码一区二区三区天堂古代 | 久久成人国产精品一区二区| 精品国产日产一区二区三区 |