LeetCode 92. 反转链表 II

一时失言乱红尘 2022-11-10 14:27 234阅读 0赞

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

  1. 示例 1
  2. 输入:head = [1,2,3,4,5], left = 2, right = 4
  3. 输出:[1,4,3,2,5]
  4. 示例 2
  5. 输入:head = [5], left = 1, right = 1
  6. 输出:[5]
  7. 提示:
  8. 链表中节点数目为 n
  9. 1 <= n <= 500
  10. -500 <= Node.val <= 500
  11. 1 <= left <= right <= n
  12. 来源:力扣(LeetCode
  13. 链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
  14. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

  1. 为链表创建新的头结点,以便所有可能情况进行统一处理;
  2. 循环找到左节点leftNode及左节点前面的一个结点leftpre;
  3. 继续循环,找到右结点rightNode及右结点的next结点p;
  4. 利用链表翻转函数(递归翻转)将leftNode~rightNode区间的链表翻转;
  5. leftpre.next连接rightNode;
  6. leftNode.next连接p;
  7. 返回newhead头结点的next即可。

    /**

    • Definition for singly-linked list.
    • public class ListNode {
    • int val;
    • ListNode next;
    • ListNode() {}
    • ListNode(int val) { this.val = val; }
    • ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    • }
      */
      class Solution {

    public ListNode reverseBetween(ListNode head, int left, int right) {

    1. if(left==right) return head;
    2. int cnt=1;
    3. ListNode leftNode=null;
    4. ListNode newhead=new ListNode(0);
    5. newhead.next=head;
    6. ListNode leftpre=newhead;
    7. ListNode rightNode=null;
    8. ListNode p=head;
    9. while(cnt<left) {
    10. leftpre=leftpre.next;
    11. p=p.next;
    12. cnt++;
    13. }
    14. leftNode=p;
    15. while(cnt<right) {
    16. p=p.next;
    17. cnt++;
    18. }
    19. rightNode=p;
    20. p=p.next;
    21. rightNode.next=null;
    22. dfs(leftNode);
    23. leftpre.next=rightNode;
    24. leftNode.next=p;
    25. return newhead.next;
    26. }
    27. public ListNode dfs(ListNode head) {
    28. if(head==null) return new ListNode(0);
    29. ListNode tmp=dfs(head.next);
    30. tmp.next=head;
    31. head.next=null;
    32. return head;
    33. }

    }

发表评论

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

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

相关阅读