題目
是編寫演算法將帶一單鏈表逆置,要求空間複雜度為o(1
)o(1)
o(1)。分析
單鏈表分為帶頭節點和不帶頭節點兩種,逆置思路有兩種,第一種是採用頭插法重新建立新的單鏈表,該方法直接遍歷鍊錶,每次將當前結點新增到新鍊錶的頭部;第二種是通過該錶*next
指標,定義三個指標*pre, *p, *r
,分別表示三個連續結點,將p->next
指向pre
,但同時p
的後繼節點會斷開,所以需要用r
儲存其後繼節點。
**下面分別展示帶頭節點的單鏈表和不帶頭節點的單鏈表,採用上述兩種思路實現單鏈表逆置:
1. 帶頭結點單鏈表⟶
\longrightarrow
⟶頭插法
void
reverse_1
(lnode &l)
}
2. 帶頭結點單鏈表⟶
\longrightarrow
⟶修改*next
指標
void
reverse_2
(lnode &l)
pre = p;
p = r;
r = r-
>next;
p->next = pre;
} l.next = p;
}
3. 不帶頭結點單鏈表⟶
\longrightarrow
⟶頭插法
lnode*
reverse_1
(lnode *l)
return p;
}
4. 不帶頭結點單鏈表⟶
\longrightarrow
⟶修改*next
指標
lnode*
reverse_2
(lnode *l)
pre = p;
p = r;
r = r-
>next;
p->next = pre;
}return p;
}
總結
上述幾種方法的時間複雜度均為o(n
)o(n)
o(n)
,空間複雜度為o(1
)o(1)
o(1)
。
單鏈表原地逆置
1.有頭結點的單鏈表原地逆置 尾插法 bool reverse1 listnode l 翻轉後l為頭結點 return true 2.無頭結點的單鏈表原地逆置 外加乙個頭結點 bool reverse2 listnode l 最後l為尾結點 return true 3.翻轉鍊錶中第m個節點到第n個節...
單鏈表原地逆置
給定乙個帶頭結點的單鏈表,編寫演算法將其原地逆置。所謂 原地 是指空間複雜度為o 1 有兩種方法,頭插法和冒泡法。這兩種方法的時間複雜度均為o n 我們知道,用頭插法建立鍊錶,得到的鍊錶中元素的順序和輸入的順序相反,所以利用這一特點,可以將鍊錶逆置。給定乙個帶頭結點的單鏈表l,如下圖所示。首先用指標...
單鏈表逆置
單鏈表逆置 include include define item num 10 typedef struct tagnode node node linklist create void linklist destroy node head void linklist print node hea...