[关闭]
@w1024020103 2017-07-18T11:12:06.000000Z 字数 1591 阅读 540

Reverse Linked List II

LintCode LeetCode


在此输入正文

这道题一开始卡在了不知道怎么保留开始reverse的节点前面那个节点,因为最后reverse完了得用到它。发现自己一直在移动那个节点的reference,导致最后没办法连结逆转完之后的节点。

后来想明白了(参考了答案),一开始记录下来的开始reverse的前一个点nodePrem, 要一直不动。参与reverse的点才需要动。
这样我们就需要写下四个点:
nodePrem;
nodem;
noden(prev);
nodenplus(curt)

其中nodePrem, nodem是不能动的,因为我们最后reverse完了需要用他们来衔接。注意到这里的prev是从nodem开始的,而不是nodePrem。记住prev,curt是要参与遍历的点,它不可能从一个我们需要保持不动的点开始(比如这里的nodePrem). 而且一定要记得:动的是prev,不是nodem. 我们可以把这里的prev, curt看作是noden, nodenplus.这是可以的,因为通过遍历我们可以到达noden, nodenplus的真实位置。

  1. /**
  2. * Definition for ListNode
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) {
  7. * val = x;
  8. * next = null;
  9. * }
  10. * }
  11. */
  12. public class Solution {
  13. /**
  14. * @param ListNode head is the head of the linked list
  15. * @oaram m and n
  16. * @return: The head of the reversed ListNode
  17. */
  18. public ListNode reverseBetween(ListNode head, int m , int n) {
  19. // write your code
  20. ListNode dummy = new ListNode(0);
  21. dummy.next = head;
  22. head = dummy;
  23. for (int i = 1; i < m; i++){
  24. if (head == null){
  25. return null;
  26. }
  27. head = head.next;
  28. }
  29. /**
  30. * We need to record four points:(or three because noden and nodem starts the same)
  31. *
  32. * 1. nodePrem : the point before the one who needs to be reversed in the original list (remain the same)
  33. * 2. nodem: the first node to be reversed in the original list. (stay the same)
  34. * the above two are used to link the reversed list in the end.
  35. *
  36. * 3. noden: the second node to be reversed. (increase)
  37. * 4. nodePostn : the node after the last node to be reversed in the original list
  38. * (increase)
  39. * the above two are used during the reverse process.
  40. *
  41. *
  42. */
  43. ListNode nodePrem = head;
  44. ListNode nodem = head.next;
  45. ListNode noden = nodem;
  46. ListNode nodePostn = noden.next;
  47. for (int i = m; i < n; i++){
  48. ListNode temp = nodePostn.next;
  49. nodePostn.next = noden;
  50. noden = nodePostn;
  51. nodePostn = temp;
  52. }
  53. nodePrem.next = noden;
  54. nodem.next = nodePostn;
  55. return dummy.next;
  56. }
  57. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注