鏈表反轉(zhuǎn),就是鏈表原來是1->2->3->4->5,經(jīng)過反轉(zhuǎn)處理過后變成5->4->3->2->1
處理鏈表反轉(zhuǎn),有兩種方式,一個是建立虛擬頭結(jié)點,一個是直接操作鏈表反轉(zhuǎn)。
1. 建立虛擬頭結(jié)點
?這是執(zhí)行的流程
最核心的兩行就是
cur.next = ans.next; ans.next = cur;
直接想我要讓她反轉(zhuǎn),我現(xiàn)在設(shè)立了虛擬頭結(jié)點,那我就要讓新加進這個反轉(zhuǎn)鏈表的結(jié)點的next為我反轉(zhuǎn)鏈表中ans的next,再讓ans的next設(shè)為當前結(jié)點,也就是我剛才處理的結(jié)點。
public static ListNode reverseList(ListNode head) {
ListNode ans = new ListNode(-1);
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = ans.next;
ans.next = cur;
cur = next;
}
return ans.next;
}
這里我對于代碼的理解是剛開始設(shè)立了ans,但是還沒有將ans.next設(shè)為第一個結(jié)點1,是在第一次循環(huán)的時候做的,cur剛開始是原鏈表的1,循環(huán)中,
將cur.next也就是2先設(shè)立為next,讓ans.next(null)給到cur.next,這里做的是讓原鏈表頭結(jié)點1的next為null,因為在反轉(zhuǎn)之后,1作為鏈表的尾結(jié)點,next為null。
然后讓cur(1)給到ans.next,就是讓ans和1建立起了關(guān)聯(lián)。
然后讓next也就是原鏈表的頭結(jié)點1的下一個結(jié)點,給到cur,在處理下一個結(jié)點。這樣就實現(xiàn)了鏈表反轉(zhuǎn)。
2. 直接在鏈表操作
這種也是要會的
文章來源:http://www.zghlxwxcb.cn/news/detail-642381.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-642381.html
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
到了這里,關(guān)于算法通關(guān)村第二關(guān)——鏈表反轉(zhuǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!