题解 | #反转链表#

反转链表

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;
    }
}
全部评论

相关推荐

10-11 15:42
皖西学院 Java
青鱼LINK:我硕士,也是java0面试,吾道不孤
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务