反轉鍊錶(非遞迴,哨兵,遞迴)

2021-10-22 13:47:50 字數 1620 閱讀 3077

給你單鏈表的頭節點 head 和兩個整數 left 和 right ,其中 left <= right 。請你反轉從位置 left 到位置 right 的鍊錶節點,返回 反轉後的鍊錶 。

非遞迴解法

​ 反轉cur.next

cur.next = pre ;

pre = cur;

cur = next

next = cur.next;

新建乙個頭結點,頭插法(哨兵法)

head.next = cur;

cur = cur.next;

return head.next;

遞迴解法

思路:將兩個結點間的指標換個方向

遞迴到底部:

遞迴回根:

1.基於非遞迴

由於翻轉指定區間,反轉區間外的兩個指標無論是否空都不處理,所以要做好判斷。

public listnode reversebetween(listnode head, int left, int right) 

listnode pre = p, cur = p.next, next = cur.next, tail = p;

while(cur!=null)

next = cur.next;

now++;

}return ppre==null?pre:head; //left為1 ppre為空,head被處理了

}

2.基於遞迴
listnode successor = null; // 後驅節點

// 反轉以 head 為起點的 n 個節點,返回新的頭結點

listnode reversen(listnode head, int n)

// 以 head.next 為起點,需要反轉前 n - 1 個節點

listnode last = reversen(head.next, n - 1);

head.next.next = head;

// 讓反轉之後的 head 節點和後面的節點連起來

head.next = successor;

return last;

}

public listnode reversebetween(listnode head, int m, int n)

// 前進到反轉的起點觸發 base case

head.next = reversebetween(head.next, m - 1, n - 1);

return head;

}

反轉鍊錶 遞迴和非遞迴實現

include stdafx.h include include struct node void createlink node head,int data void printlink node head void reverselink node head node reverselink n...

反轉鍊錶 遞迴與非遞迴實現

一 迭代實現 思路 通過每次遍歷,修改當前結點與上一結點指向,遍歷到最後乙個結點,鍊錶也就實現了反轉 首先我們定義三個指標,分別指向當前節點cur 前一結點pre 下一節點next,並且pre和next為null 起始狀態為 第一次 執行 next cur next cur next pre pre...

鍊錶的建立 輸出 非遞迴反轉 遞迴反轉

鍊錶的建立 輸出 非遞迴反轉 遞迴反轉 如下 include include include include include include include include include include include include using namespace std const int m...