定義一個(gè)函數(shù),輸入一個(gè)鏈表的頭節(jié)點(diǎn)涧狮,反轉(zhuǎn)該鏈表并輸出反轉(zhuǎn)后鏈表的頭節(jié)點(diǎn)炕矮。
1,使用棧解決
最簡單的一種方式就是使用棧者冤,因?yàn)闂J窍冗M(jìn)后出的肤视。實(shí)現(xiàn)原理就是把鏈表節(jié)點(diǎn)一個(gè)個(gè)入棧,當(dāng)全部入棧完之后再一個(gè)個(gè)出棧涉枫,出棧的時(shí)候在把出棧的結(jié)點(diǎn)串成一個(gè)新的鏈表邢滑。
public ListNode reverseList(ListNode head) {
Stack<ListNode> stack = new Stack<>();
//把鏈表節(jié)點(diǎn)全部摘掉放到棧中
while (head != null) {
stack.push(head);
head = head.next;
}
if (stack.isEmpty())
return null;
ListNode node = stack.pop();
ListNode dummy = node;
//棧中的結(jié)點(diǎn)全部出棧,然后重新連成一個(gè)新的鏈表
while (!stack.isEmpty()) {
ListNode tempNode = stack.pop();
node.next = tempNode;
node = node.next;
}
//最后一個(gè)結(jié)點(diǎn)就是反轉(zhuǎn)前的頭結(jié)點(diǎn)愿汰,一定要讓他的next
//等于空困后,否則會構(gòu)成環(huán)
node.next = null;
return dummy;
}
2,雙鏈表求解
雙鏈表求解是把原鏈表的結(jié)點(diǎn)一個(gè)個(gè)摘掉衬廷,每次摘掉的鏈表都讓他成為新的鏈表的頭結(jié)點(diǎn)摇予,然后更新新鏈表。
public ListNode reverseList(ListNode head) {
//新鏈表
ListNode newHead = null;
while (head != null) {
//先保存訪問的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)吗跋,保存起來
//留著下一步訪問的
ListNode temp = head.next;
//每次訪問的原鏈表節(jié)點(diǎn)都會成為新鏈表的頭結(jié)點(diǎn)侧戴,
//其實(shí)就是把新鏈表掛到訪問的原鏈表節(jié)點(diǎn)的
//后面就行了
head.next = newHead;
//更新新鏈表
newHead = head;
//重新賦值,繼續(xù)訪問
head = temp;
}
//返回新鏈表
return newHead;
}
3跌宛,遞歸解決
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode reverse = reverseList(head.next);
head.next.next = head;
head.next = null;
return reverse;
}
作者:sdwwld
鏈接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/3chong-jie-jue-fang-shi-zhan-shuang-lian-biao-di-g/
來源:力扣(LeetCode)