解法一:数组

完整遍历链表,用数组存储每个结点的信息。然后从后往前,将后一半的结点插入目标位置,最后将新的尾结点的 next 指针设为 null

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public void reorderList(ListNode head) {
  13. if (head == null) {
  14. return;
  15. }
  16. List<ListNode> list = new ArrayList<>();
  17. for (ListNode p = head; p != null; p = p.next) {
  18. list.add(p);
  19. }
  20. ListNode left = head;
  21. ListNode right = head.next;
  22. int len = list.size();
  23. for (int i = len - 1; i >= (len + 1) / 2; --i) {
  24. left.next = list.get(i);
  25. list.get(i).next = right;
  26. left = right;
  27. right = right.next;
  28. //System.out.println(left.val);
  29. //System.out.println(right.val);
  30. }
  31. if ((len & 1) == 1){
  32. left.next = null;
  33. } else {
  34. right.next = null;
  35. }
  36. }
  37. }