ayaov

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

剑指 Offer 06. 从尾到头打印链表

https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/

  1. 链表中的元素通过指针相连,从头结点顺序遍历链表元素,依次插入栈中,栈是先入后出的,反过来遍历栈就相当于,链表的倒序。
  • 代码如下:
  class Solution {
      public int[] reversePrint(ListNode head) {
          Stack<Integer> stack = new Stack<>();
          ListNode temp = head;
          while(temp!=null){
              stack.push(temp.val);
              temp = temp.next;
          }
          int size = stack.size();
          int[] res = new int[size];
          int i=0;
          while(!stack.empty()){
              res[i] = stack.pop();
              i=i+1;
          }
          return res;
      }
  }

剑指 Offer 24. 反转链表

https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/

  1. 调转指针,将当前节点的next指向前一个节点,为了不断链,在遍历时记录当前节点的下一个节点
  2. 头节点的前一个节点为null,初始化前驱节点为null
  3. 当前节点在指向前一个节点之后,前驱节点指针后移,当前指针指向已经被记录的Next节点
  • 代码如下:
  class Solution {
      public ListNode reverseList(ListNode head) {
          ListNode prev = null;
          ListNode cur = head;
          while(cur!=null){
              ListNode next = cur.next;
              cur.next = prev;
              prev = cur;
              cur = next;
          }
          return prev;

      }
  }

剑指 Offer 35. 复杂链表的复制 中等

https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
思路如下:

  1. 原地复制,原链表的每一个节点的next都是复制节点,复制节点的下一个是原链表节点的下一个节点
    copy.next=node.next;node.next = copy。copy节点的next先指向node节点的下一个,然后node节点再指向copy节点,以免断链。
  2. 拷贝random节点,下一个复制节点的random就等于当前原链表节点的random节点的下一个节点
    node.next.random = node.random.next;
  3. 每次遍历都指向next.next,即原链表的节点上
  4. 最后拆分重复的链表,新链表头节点指向原链表头节点的下一个节点
  5. 每次都指向当前节点的next的next,避免断链,先记录当前节点的下一个节点的地址
    temp = node.next;node.next = temp.next;node = temp
  • 代码如下:(复制的别人的)
  class Solution {
      public Node copyRandomList(Node head) {
          if (head == null) {
              return head;
          }
          //将拷贝节点放到原节点后面,例如1->2->3这样的链表就变成了这样1->1'->2->2'->3->3'
          for (Node node = head, copy = null; node != null; node = node.next.next) {
              copy = new Node(node.val);
              copy.next = node.next;
              node.next = copy;
          }
          //把拷贝节点的random指针安排上
          for (Node node = head; node != null; node = node.next.next) {
              if (node.random != null) {
                  node.next.random = node.random.next;
              }
          }
          //分离拷贝节点和原节点,变成1->2->3和1'->2'->3'两个链表,后者就是答案
          Node newHead = head.next;
          for (Node node = head, temp = null; node != null && node.next != null;) {
              temp = node.next;
              node.next = temp.next;
              node = temp;
          }

          return newHead;
      }
  }
posted on 2021-12-02 21:51  ayaov  阅读(23)  评论(0)    收藏  举报