题解 | #反转链表#

反转链表

http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

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

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {

//         return reverseNodeMethod1(head);
        return reverseNodeMethod2(head);

    }

    public ListNode reverseNodeMethod1(ListNode head){

        if (head == null || head.next == null) {
            return head;
        }

        ListNode preNode = head;
        ListNode curNode = head.next;
        ListNode temp = null;

        while (curNode != null) {
            //1->2->3 先记住当前节点2的第三个节点3 采取的移动方法是先让2->1 然后再让3->2 一个一个倒挂到头节点 最后就变成了3->2->1
            temp = curNode.next;
            //头结点指向第三个节点 此时相当于操作head.next 即2节点 curNode只是个临时变量
            curNode.next = preNode;
            //让头节点此时从1变为2 此时2->1 temp记录了3 后续才能让3->2 这样就实现反转了
            preNode = curNode;
            //让当前操作节点变为3 此时让临时变量curNode指向3节点
            curNode = temp;
        }

        head.next = null;
        return preNode;
    }

    public ListNode reverseNodeMethod2(ListNode head){

        if (head == null || head.next == null) {
            return head;
        }

        ListNode temp = head;
        int len = 0;
        while (temp != null) {
            len ++;
            temp = temp.next;
        }

        ListNode headNode = new ListNode(-1);
        headNode.next = head;

        ListNode curNode = head;
        ListNode tempNode = null;

        //从第二个节点开始进行头插
        for (int i = 1; i < len; i++) {
            tempNode = curNode.next;
            curNode.next = tempNode.next;
            tempNode.next = headNode.next;
            headNode.next = tempNode;
        }

        return headNode.next;
    }
}
刷刷题 文章被收录于专栏

刷刷题 活跃活跃脑细胞

全部评论

相关推荐

浩浩没烦恼:一二面加起来才一个小时? 我一面就一个小时多了
点赞 评论 收藏
分享
WhiteAlbum...:学院本2中大厂垂直实习➕acm比赛 秋招0面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务