leetcode 92. 反转链表 II

一时失言乱红尘 2023-06-30 15:57 124阅读 0赞

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

思路: dfs+回溯时修改链表

我觉得没啥可以分析的。只要理解了dfs的过程,然后稍微处理一下边界条件即可。

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* reverseBetween(ListNode* head, int m, int n) {
  12. if(head==NULL) return NULL;
  13. ListNode *ans = new ListNode(0);
  14. ListNode *p=head;
  15. ListNode *q=NULL;
  16. ListNode *last=new ListNode(0);
  17. int k=1;
  18. while(k<m)
  19. {
  20. q=p;
  21. p=p->next;
  22. k++;
  23. }
  24. //cout<<k<<endl;
  25. dfs(p,NULL,ans,last,m,n,k);
  26. //cout<<last->val<<endl;
  27. if(q==NULL) return ans;
  28. else q->next=ans;
  29. return head;
  30. }
  31. void dfs(ListNode *head,ListNode *pre,ListNode *&ans,ListNode *&last, int m,int n,int k)
  32. {
  33. if(k<=n)
  34. {
  35. int tmp=k;
  36. tmp++;
  37. dfs(head->next,head,ans,last,m,n,tmp);
  38. }
  39. if(k==n) ans=head;
  40. if(k==n+1)
  41. {
  42. last=head;
  43. return;
  44. }
  45. if(k==m)
  46. {
  47. head->next=last;
  48. return;
  49. }
  50. head->next=pre;
  51. }
  52. };

发表评论

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

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

相关阅读