定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL限制:
0 <= 节点个数 <= 5000
详细解题思路见代码注释
public class Solution {
/**
* 思路: 将当前currentListNode的next指针指向preListNode
* 注意点: 记录下currentListNode的nextNode, 待上面的操作完成, 更改变量引用, 否则下次循环没有currentListNode
* @param head
* @return
*/
public ListNode reverseList(ListNode head) {
// 非空判断: 1, 如果head参数是null, 此时链表中无元素; 2, 如果head.next为null,此时链表只有一个元素
if(head==null||head.next ==null){
return head;
}
ListNode preNode = null;
ListNode thisNode = head;
ListNode nextNode = null;
while (thisNode != null) {
//1, 记录下nextNode: 修改thisNode的next指针钱
nextNode = thisNode.next;
//2, 修改next指针指向: 修改当前节点的next指针指向preNode
thisNode.next = preNode;
//3, 更改变量引用: 为下一个循环做准备
preNode = thisNode;
thisNode = nextNode;
}
// 返回preNode: 这时的preNode肯定不是null, 是循环结束的最后一个元素
return preNode;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
复杂度分析
时间复杂度:O(n)O(n),其中 nn 是链表的长度。需要遍历链表一次。
空间复杂度:O(1)O(1)。