雙指針 i=0、j=N-1 向中間逼近,交換元素,循環 N/2 次即完成。
int array[N] = {100,90,80,70,60,50,50,40};
for (i=0, j=N-1; i
時間 O(N/2) = O(N),空間 O(1)。
r:新鏈表頭(已反轉部分)y:當前待處理節點t:暫存 y->next 防止斷鏈// 初始:r=NULL, y=head
while (y != NULL) {
t = y->next; // (1) 備份下一節點
y->next = r; // (2) 反轉指向
r = y; // (3) 推進新頭
y = t; // (4) 推進舊鏈表
}
return r; // 返回新頭
struct Node { int data; Node* next; };
Node* reverse(Node* x) {
if (!x) return NULL;
Node *r = NULL, *y = x, *t;
while (y) {
t = y->next;
y->next = r;
r = y;
y = t;
}
return r;
}
時間 O(N)(單次遍歷),空間 O(1)(原地反轉)。
來源:「C++」博客,原文連結:https://ljqy27.blog.51cto.com/1054/40153。