剑指offer(十二)之反转链表

来源:互联网 发布:优化服务指导意见 编辑:程序博客网 时间:2024/06/13 03:07
题目描述

输入一个链表,反转链表后,输出链表的所有元素。

思路分析:

用栈来存储链表的节点,栈是先进后出,再将栈弹出到一个新链表中即可。

代码:

import java.util.*;
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null || head.next==null){
            return head;
        }   
    Stack stack = new Stack();
        ListNode in = head;
        ListNode out = head;
        while(in!=null){
            stack.push(in.val);
            in = in.next;
        }
        while(out!=null){
            out.val = (int)stack.pop();
            out = out.next;
        }
        return head;
    }
}

或者

每次循环的情况写出来,假设初始链表是 0 -> 1 -> 2 -> 3 -> 4 
// 0 -> 1 -> 2 -> 3 -> 4   oldHead指向0, newHead指向0,toBeReversed指向1
// 1 -> 0 -> 2 -> 3 -> 4   oldHead指向0, newHead指向1,toBeReversed指向2
// 2 -> 1 -> 0 -> 3 -> 4  oldHead指向0, newHead指向2,toBeReversed指向3
// 3 -> 2 -> 1 -> 0 -> 4   oldHead指向0, newHead指向3,toBeReversed指向4
// 4 -> 3 -> 2 -> 1 -> 0   oldHead指向0, newHead指向4,toBeReversed指向null
public ListNode ReverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode oldHead = head;
        ListNode newHead = head;
        ListNode toBeReversed = head.next;
        do {
            oldHead.next = toBeReversed.next;
            toBeReversed.next = newHead;
            newHead = toBeReversed;
            toBeReversed = oldHead.next;
        } while (toBeReversed!=null);
        return newHead;
}


0 0
原创粉丝点击