定義一個(gè)函數(shù),輸入一個(gè)鏈表的頭節(jié)點(diǎn),反轉(zhuǎn)該鏈表并輸出反轉(zhuǎn)后鏈表的頭節(jié)點(diǎn)
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
解題思路
如果只有一個(gè)節(jié)點(diǎn), 返回頭節(jié)點(diǎn)即可
不止一個(gè)節(jié)點(diǎn)時(shí), 需要三個(gè)索引, 遍歷時(shí), 一個(gè)指向(原順序的)上一個(gè)節(jié)點(diǎn)、當(dāng)前節(jié)點(diǎn)、下一個(gè)節(jié)點(diǎn)
遍歷時(shí)的邏輯如下
next = cur.next;
// 判斷下一個(gè)節(jié)點(diǎn)是否為空, 空則說(shuō)明cur已經(jīng)是尾結(jié)點(diǎn)
if (next == null) {
newHead = cur;
}
// 將當(dāng)前節(jié)點(diǎn)的next指向上一個(gè)節(jié)點(diǎn)(如果是頭節(jié)點(diǎn)則指向空)
cur.next = prev;
// 上一個(gè)節(jié)點(diǎn)賦值為當(dāng)前
prev = cur;
// 當(dāng)前節(jié)點(diǎn)賦值為下一個(gè)節(jié)點(diǎn)
cur = next;
當(dāng)當(dāng)前節(jié)點(diǎn)next為空時(shí), 說(shuō)明當(dāng)前節(jié)點(diǎn)是尾節(jié)點(diǎn), 也就是新節(jié)點(diǎn)的頭節(jié)點(diǎn)
代碼
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) {
return null;
}
// 如果只有一個(gè)節(jié)點(diǎn)
if (head.next == null) {
return head;
}
// 四個(gè)變量: 新的頭結(jié)點(diǎn), 當(dāng)前節(jié)點(diǎn), 上一個(gè)節(jié)點(diǎn), 下一個(gè)節(jié)點(diǎn)
ListNode newHead = null;
ListNode cur = head;
ListNode prev = null;
ListNode next;
while (cur != null) {
next = cur.next;
// 判斷下一個(gè)節(jié)點(diǎn)是否為空, 空則說(shuō)明cur已經(jīng)是尾結(jié)點(diǎn)
if (next == null) {
newHead = cur;
}
// 將當(dāng)前節(jié)點(diǎn)的next指向上一個(gè)節(jié)點(diǎn)(如果是頭節(jié)點(diǎn)則指向空)
cur.next = prev;
// 上一個(gè)節(jié)點(diǎn)賦值為當(dāng)前
prev = cur;
// 當(dāng)前節(jié)點(diǎn)賦值為下一個(gè)節(jié)點(diǎn)
cur = next;
}
return newHead;
}
}