定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
解题思路
如果只有一个节点, 返回头节点即可
不止一个节点时, 需要三个索引, 遍历时, 一个指向(原顺序的)上一个节点、当前节点、下一个节点
遍历时的逻辑如下
next = cur.next;
// 判断下一个节点是否为空, 空则说明cur已经是尾结点
if (next == null) {
newHead = cur;
}
// 将当前节点的next指向上一个节点(如果是头节点则指向空)
cur.next = prev;
// 上一个节点赋值为当前
prev = cur;
// 当前节点赋值为下一个节点
cur = next;
当当前节点next为空时, 说明当前节点是尾节点, 也就是新节点的头节点
代码
/**
* 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;
}
// 如果只有一个节点
if (head.next == null) {
return head;
}
// 四个变量: 新的头结点, 当前节点, 上一个节点, 下一个节点
ListNode newHead = null;
ListNode cur = head;
ListNode prev = null;
ListNode next;
while (cur != null) {
next = cur.next;
// 判断下一个节点是否为空, 空则说明cur已经是尾结点
if (next == null) {
newHead = cur;
}
// 将当前节点的next指向上一个节点(如果是头节点则指向空)
cur.next = prev;
// 上一个节点赋值为当前
prev = cur;
// 当前节点赋值为下一个节点
cur = next;
}
return newHead;
}
}