[Algorithms] Array & Linked List

反转链表(简单)

问题链接:reverse-linked-list

  • 非递归方式
public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
      return head;
    }
    ListNode pre = null;
    ListNode curr = head;
    while (curr != null) {
      ListNode next = curr.next;
      curr.next = pre;
      pre = curr;
      curr = next;
    }
    return pre;
}
  • 递归方式
public ListNode reverseList(ListNode head) {
  if(head == null || head.next == null){
    return head;
  }
  ListNode newNode = reverseList(head.next);
  newNode.next = head;
  head.next = null;
  return newNode;
}

两两交换链表中的节点(中等)

问题链接:swap-nodes-in-pairs

  • 非递归方式
public ListNode swapPairs(ListNode head) {
  if (head == null || head.next == null) {
    return head;
  }
  ListNode dummy = new ListNode(0);
  ListNode prev = dummy;
  dummy.next = head;
  ListNode curr = head;
  while (curr != null) {
    ListNode next = curr.next;
    if (next == null) {
      break;
    }
    prev.next = next;
    curr.next = next.next;
    next.next = curr;
    prev = curr;
    curr = curr.next;
  }
  return dummy.next;
}
  • 递归方式
public ListNode swapPairs(ListNode head) {
  if (head == null || head.next == null) {
    return head;
  }
  ListNode next = head.next;
  head.next = swapPairs(next.next);
  next.next = head;
  return next;
}

环形链表(简单)

问题链接:linked-list-cycle

public boolean hasCycle(ListNode head) {
  ListNode slow = head;
  ListNode fast = head;
  while (fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
    if (slow == fast) {
      return true;
    }
  }
  return false;
}

环形链表ii(中等)

问题链接:linked-list-cycle-ii

public ListNode detectCycle(ListNode head) {
  ListNode tortoise = head;
  ListNode hare = head;
  while (hare != null && hare.next != null) {
    tortoise = tortoise.next;
    hare = hare.next.next;
    if (tortoise == hare) {
      tortoise = head;
      while (tortoise != hare) {
        tortoise = tortoise.next;
        hare = hare.next;
      }
      return tortoise;
    }
  }
  return null;
}

K 个一组翻转链表(困难)

问题链接:reverse-nodes-in-k-group

  • 顺序执行的方式,分组反转,然后合并结果
public ListNode reverseKGroup(ListNode head, int k) {
  ListNode dummy = new ListNode(0);
  dummy.next = head;

  ListNode prev = dummy;
  ListNode end = dummy;

  while (end.next != null) {
    ListNode start = prev.next;
    for (int i = 0; i < k && end != null; i++) {
      end = end.next;
    }
    if (end == null) {
      break;
    }

    ListNode next = end.next;
    end.next = null;
    prev.next = reverse(start);
    start.next = next;

    prev = start;
    end = prev;
  }

  return dummy.next;
}

public ListNode reverse(ListNode head) {
  if (head == null || head.next == null) {
    return head;
  }

  ListNode pre = null;
  ListNode curr = head;
  while (curr != null) {
    ListNode next = curr.next;
    curr.next = pre;
    pre = curr;
    curr = next;
  }
  return pre;
}
posted @ 2019-08-22 17:28  NotNil  阅读(104)  评论(0编辑  收藏  举报