0
点赞
收藏
分享

微信扫一扫

(重排链表)(利用栈实现链表的从后往前遍历)(同时注意要切断尾部的next域,避免形成环形链表)

林肯公园_97cc 2022-03-16 阅读 40

文章目录

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

/*

  • 思路:
  • 如果这是数组的话,相信大多数人都会做,
  • 但是本题是链表,,没办法从尾节点向前遍历,
  • 所以利用一个栈的pop到pos里面,实现从后往前遍历,
  • 并且用一个从前往后的指针pre和 pos相互呼应,
  • 只要pre 与 pos不重合 并且 pre.next != pos ,就把pos插在pre的前面
  • */

代码及注释

class Solution {
    
/*
* 思路:
* 如果这是数组的话,相信大多数人都会做,
* 但是本题是链表,,没办法从尾节点向前遍历,
* 所以利用一个栈的pop到pos里面,实现从后往前遍历,
* 并且用一个从前往后的指针pre和 pos相互呼应,
* 只要pre 与 pos不重合 并且 pre.next != pos ,就把pos插在pre的前面
* */
    public void reorderList(ListNode head) {
       Stack<ListNode> stack = new Stack<>();
        if(head == null || head.next == null ){
            return;
        }

        ListNode work = head;
        while(work != null) {   // 将结点入栈
            stack.add(work);
            work = work.next;
        }

        ListNode pre = head;    // 从前往后
        ListNode pos = stack.pop();//从后往前

        while( pre != pos && pre.next != pos){ // 只要pre 和 pos 不重合,并且 pre.next != pos 就把pos插到pre的前面
            ListNode tem = pre.next;
            pos.next = pre.next;
            pre.next = pos;

            pre =tem;
            pos = stack.pop();

        }
        pos.next = null;	// 注意要切断尾部的next域,避免形成环形链表
    }
}
举报

相关推荐

0 条评论