剑指Offer——反转链表

1、题目描述

  输入一个链表,反转链表后,输出新链表的表头。

2、代码实现

package com.baozi.offer;

/**
 * 输入一个链表,反转链表后,输出新链表的表头。
 *
 * @author BaoZi
 * @create 2019-07-11-15:53
 */
public class Offer12 {
    public static void main(String[] args) {
        Offer12 offer12 = new Offer12();
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(4);
        ListNode l5 = new ListNode(5);
        ListNode l6 = new ListNode(6);
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        l6.next = null;
        ListNode result = offer12.ReverseList(l1);
        ListNode temp = result;
        while (temp != null) {
            System.out.println(temp.val);
            temp = temp.next;
        }
    }

    //根据gang'hao'xiang'f题目的要求是要实现一个链表的反转,那么我们可以重新创建一个新的链表,只是这个新链表创建的
    //过程使用的是头插法,这样新的链表的元素顺序就和原来链表的顺序刚好相反
    public ListNode ReverseList(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode newHead = new ListNode(-1);
        ListNode temp1 = head;
        while (temp1 != null) {
            //先把原来链表的当前节点的next保存起来便于下一次循环的时候使用
            ListNode t = temp1.next;
            //下边这两行代码就是使用的头插法创建单链表(先指定空指针的指向,在修改非空指针的指向)
            temp1.next = newHead.next;
            newHead.next = temp1;
            temp1 = t;
        }
        //因为我们创建的新链表的头节点只是为了便于操作,所以实际返回的时候要把这个头节点去掉
        return newHead.next;
    }
}

  

原文地址:https://www.cnblogs.com/BaoZiY/p/11170661.html