LeetCode链表专题01: 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:

输入: 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)。

猜你喜欢

转载自blog.csdn.net/malipku/article/details/115274078