反转链表

193 阅读1分钟

题目

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 0≤n≤1000

要求:空间复杂度 O(1) ,时间复杂度 O(n) 。

如当输入链表{1,2,3}时,

经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

以上转换过程如下图所示:

解法

双链表循环求解

先创建一个新的空链表,依次截取反转链表

public ListNode ReverseList (ListNode head) {
    //先创建一个空链表,每次反转都写在这个链表后面
    ListNode newHead = null;
    //循环
    while(head != null){
        //先创建一个链表保存不参与循环的节点部分,当做循环部分的依据
        ListNode temp = head.next;
        //将新链表替代需循环外的节点
        head.next = newHead;
        //此时head是依次反转的
        newHead = head;
        //将之间存储的节点重新赋值给head继续下一轮循环,直到head为空
        head = temp;
    }
    retern newHead;
}