题解 | #反转链表#
反转链表
http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
单链表的逆转可使用一个新链表,将老的链表以头插法逐个链接到新的链表中(题目中给的demo不含头节点,head是第一个节点);
思路:
1、遍历旧链表,挨个取出节点;
2、以头插法,将旧链表取出的节点插入新链表(注意:取一个节点,就插入一次);
3、设置临时变量(temp),该临时变量指向将要取出的节点的下一个节点,防止断链;
核心代码如下:
public class Solution { private ListNode newHead = new ListNode(0); public ListNode ReverseList(ListNode head) { // 空链表或者只有一个节点的链表不需要逆转,直接返回 if (head == null || head.next == null) return head; // 临时变量,为了保存旧链表的当前节点的后继节点,防止因为移出一个节点,导致整个链断开 ListNode next2; ListNode temp = head; // 当旧链表的节点为kong时,说明逆转完毕,跳出循环 while(temp != null) { next2 = temp.next; // temp即为旧链表当前节点,旧链表当前节点的后继节点改变指向,指向新链表中头节点的后继节点 temp.next = newHead.next; // 让新链表的后继节点变为 旧链表当前取出的节点 newHead.next = temp; // 恢复temp的位置,即重新回到旧链表 temp = next2; } // 由于没有头节点,但是newHead是一个头节点,所以为了符合题目,这里返回newHead.next return newHead.next; } }