剑指offer面试题24:反转链表

面试题24:反转链表

题目描述
定义一个函数,输入一个链表的头节点,反转链表后,输出新链表的表头。

如上图,假设经过若干操作,我们已经把节点h之前的指针调整完,这些节点的next都指向前一个节点。接下来把i的next指向h。但是这时无法在链表中遍历到节点j。为了避免在节点i处断开,需要在调整节点i的next之前,把节点j保存下来。

也就是说,我们在调整节点i的next指针时,除了知道节点i本身,还需要知道前一个指针,因此我们需要把节点i的next指向节点h。同时,我们还需要事先保存i的下一个节点j,以防止链表断开。
初始化:3个指针,分别指向当前遍历到的节点、它的前一个节点及后一个节点。

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null){
            return null;
        }
        ListNode pReversedHead = null;
        ListNode pNode = head;
        ListNode pPrev = null;
        while(pNode != null){
            ListNode pNext = pNode.next;
            if(pNext == null){
              pReversedHead = pNode;
            }
            pNode.next = pPrev;
            pPrev = pNode;
            pNode = pNext;
        }
        return pReversedHead;
    }
}

时间复杂度:O(n), 遍历一次链表
空间复杂度:O(1)

你可能感兴趣的:(剑指offer刷题)