#

反转链表

http://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca

参考其他人的回答,总结了两种方法

  1. 使用JDK自带的栈,循环链表,将元素全部压入栈中。取出的时候因为栈FILO的特性,自然就反转了。这里需要注意将最后一个元素的next变为空,否则会出现死循环
  2. 使用辅助指针,指向新链表的头,以及旧链表的next
/**
 * 第一种方式:使用栈
 */
    public ListNode ReverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 放入栈中
        Stack<ListNode> stack = new Stack<>();
        while (head != null) {
            stack.push(head);
            head = head.next;
        }
        ListNode newHead = stack.pop();
        ListNode cur = newHead;
        while (!stack.isEmpty()) {
            cur.next = stack.pop();
            cur = cur.next;
        }
        cur.next = null;
        return newHead;

    }

/**
 * 第二种方式:使用辅助指针
 */
public ListNode ReverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 用指针记录
        ListNode newHead = null;
        ListNode next;
        while (head != null) {
            // 指向下一个node
            next = head.next;
            // 将当前节点脱离远链表,作为新链表的头
            head.next = newHead;
            // 将newHead转为当前节点
            newHead = head;
            // head等于下一个节点
            head = next;
        }
        return newHead;
    }


全部评论

相关推荐

Bug压路:老哥看得出来你是想多展示一些项目,但好像一般最多两个就够了😂页数一般一页,多的也就2页;这些项目应该是比较同质化的,和评论区其他大佬一样,我也觉得应该展示一些最拿手的(质量>数量)😁😁😁专业技能部分也可以稍微精简一些
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
Java抽象练习生:教育背景放最前面,不要耍小聪明
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务