剑指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;
}
}
浙公网安备 33010602011771号