当前位置:   article > 正文

ACM模式链表输入&手撕k组反转链表_acm链表 输入

acm链表 输入

 面试手撕的时候遇到了,自己没处理好,做过的题想不出来,气死,以此谨记。

 ACM模式链表输入

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. struct Node{
  5. int val;
  6. Node* next;
  7. Node(int v): val(v), next(nullptr){}
  8. };
  9. Node* creat(vector<int>& arr){
  10. Node* head = new Node(-1);
  11. Node* pre = head;
  12. for(auto& a:arr){
  13. Node* t = new Node(a);
  14. pre->next = t;
  15. pre = t;
  16. }
  17. return head;
  18. }
  19. int main(){
  20. vector<int> arr{1,2,3,4,5,6,7,8};
  21. Node* L = creat(arr);
  22. Node* t = L;//可选
  23. L = L->next;//记得!!!
  24. delete t;//可选
  25. t = nullptr;//可选
  26. /*
  27. 调用你的函数方法
  28. t = func(L);
  29. */
  30. while(t != nullptr){
  31. cout << t->val;//打印
  32. Node* tmp = t;//可选
  33. t = t->next;
  34. delete tmp; //可选
  35. }
  36. return 0;
  37. }

k个一组反转链表Leetcode25

官方的简单操作:递归

拆分问题:每次反转1组

返回值:反转后的头节点

边界条件:空或长度不到k个

  1. Node* reversek(Node* l, int k){
  2. if(k == 1 || l == nullptr) return l;
  3. Node* tail = l;
  4. for(int i = 0; i < k; ++i){//判断长度是否满足反转条件
  5. if(tail == nullptr) return l;
  6. tail = tail->next;
  7. }
  8. //循环结束时,tail指向下一组的头!
  9. Node* pre = l;
  10. Node* cur = l->next;
  11. while(cur != tail){//只需要处理k-1次
  12. Node* tmp = cur->next;
  13. cur->next = pre;
  14. pre = cur;
  15. cur = tmp;
  16. }
  17. //循环结束时,pre指向反转后的新头,cur指向下一组的头。
  18. l->next = reversek(cur, k);//l是反转后的尾节点,递归反转下一组。
  19. return pre;
  20. }

面试时手撕的复杂操作。。。 循环

  1. Node* reversek(Node* l, int k,int len){
  2. if(k == 1) return l;
  3. Node *dummy = new Node(-1);
  4. dummy -> next = l;
  5. Node * pre = dummy;//分组的头节点的前置节点
  6. Node * cur = l;
  7. for(int i = 0; i + k <= len; i += k){
  8. Node * head = cur;//反转前的头
  9. Node * p = cur;//处理反转的前置节点
  10. cur = cur->next;//从第二个节点开始处理反转
  11. for(int j = 0; j < k - 1; j++){//反转K-1次
  12. Node * tmp = cur->next;
  13. cur->next = p;
  14. p = cur;
  15. cur = tmp;
  16. }
  17. //循环结束时,p指向新的头,cur指向下一组的头
  18. head->next = cur;//反转前的头作为反转后的最后一个节点
  19. pre->next = p;//反转前的头的前置节点连接新头
  20. pre = head; //更新下一组头的前置节点
  21. }
  22. Node* res = dummy->next;
  23. delete dummy;
  24. return res;
  25. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/661747
推荐阅读
相关标签
  

闽ICP备14008679号