leetCode解题报告之Reorder List

素颜马尾好姑娘i 2022-08-26 00:45 270阅读 0赞

题目:

Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…

You must do this in-place without altering the nodes’ values.

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.

分析:

看到这个题目,我们首先容易想到的就是把链表分成两半,然后把后半部分链表进行逆序一下,之后再和前半部分结合起来就

可以将这道题目AC了!

两个要解决的问题:

1.如何快速的确定链表的中间位置的结点

2.如何将一个链表逆序,并且符合要求“You must do this in-place without altering the nodes’ values”

代码实现:

  1. package cn.xym.leetcode;
  2. class ListNode {
  3. public int val;
  4. public ListNode next;
  5. ListNode(int x) {
  6. val = x;
  7. next = null;
  8. }
  9. }
  10. public class ReorderList {
  11. public void reorderList(ListNode head) {
  12. /*先判断传入的链表是否为空*/
  13. if (head == null)
  14. return ;
  15. /*[快速求出链表的中间结点]通过两个结点,一个走1个步长,一个走2个步长,最后算出链表的中间结点middleNode*/
  16. ListNode middleNode = head;
  17. ListNode stepNode = head;
  18. while (stepNode != null && stepNode.next != null && stepNode.next.next != null){
  19. middleNode = middleNode.next;
  20. stepNode = stepNode.next.next;
  21. }
  22. /*将链表中间结点之后的链表(链表的后半部分)逆序*/
  23. ListNode T = middleNode.next;
  24. middleNode.next = null;
  25. if (T == null)
  26. return ;
  27. ListNode S = T.next;
  28. boolean flag = true;
  29. while (T != null && S != null){
  30. ListNode temp = S.next;
  31. S.next = T;
  32. if (flag) {
  33. T.next = null;
  34. flag = false;
  35. }
  36. T = S;
  37. S = temp;
  38. }
  39. /*完成链表前半部分和逆序后的后半部分的结合!*/
  40. while (T != null && head != null){
  41. ListNode temp1 = head.next;
  42. ListNode temp2 = T.next;
  43. head.next = T;
  44. T.next = temp1;
  45. head = temp1;
  46. T = temp2;
  47. }
  48. }
  49. public static void main(String[] args) {
  50. ReorderList list = new ReorderList();
  51. ListNode node1 = new ListNode(1);
  52. ListNode node2 = new ListNode(2);
  53. ListNode node3 = new ListNode(3);
  54. ListNode node4 = new ListNode(4);
  55. ListNode node5 = new ListNode(5);
  56. ListNode node6 = new ListNode(6);
  57. node1.next = node2;
  58. node2.next = node3;
  59. node3.next = node4;
  60. node4.next = node5;
  61. node5.next = node6;
  62. node6.next = null;
  63. list.reorderList(node1);
  64. while (node1 != null){
  65. System.out.println(node1.val);
  66. node1 = node1.next;
  67. }
  68. }
  69. }

发表评论

表情:
评论列表 (有 0 条评论,270人围观)

还没有评论,来说两句吧...

相关阅读