想法:动态的分配以及这些手写链表之类的确实写得很少,毕竟用到都是STL,当然这个课还是要认真学的。尤其链表还特别套娃..
就地反转的思路:平时写题目空间都是随手开..一下子给你限制空间不让你多开很难受。
第一步:
先找到头结点L;
处理出头节点的下一个结点的到达:ToNode p=L->Next;
新开一个结构体指针r,设该指针为nullptr.
然后断开头节点和p的链接,即L->next=nullptr;【这部分这么处理是因为最后我要把头结点的Next指针指向最后一个元素结点,因为我们头结点是空的嘛】
第二步:
把刚才处理出来的p看作新的队首,同样处理出k=p->Next;
然后使得p链接r: p->Next=r;
在过程中更新r=p;p=k;
以此类推。
第三步:
由于我的循环是判断while(p->Next!=nullptr)的,所以出了循环的时候p->Next仍然是nullptr,需要链接到r.
也就是p->Next=r在循环结束后的外面再连接一次。
之后把最开始的L->Next=p链接回去,就完成啦。
链表这种还是要有固定的板子比较好,感觉我的比较野路子.仅供参考~
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<map> #include<set> #include<cstdio> #include<algorithm> #define debug(a) cout<<#a<<"="<<a<<endl; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define Status bool #define OK true using namespace std; const int maxn=1e5+100; typedef long long LL; typedef struct LNode* ToNode;///定义ToNode是结构体指针 struct LNode { int Data; ToNode Next; }; void CreateList_L(ToNode &L,int n)///头插n个元素的值,正常输出元素会倒序 { L=(ToNode)malloc(sizeof(LNode)); L->Next=nullptr; for(int i=1;i<=n;i++) { ToNode p=(ToNode)malloc(sizeof(LNode)); cin>>(p->Data); p->Next=L->Next; L->Next=p; } } void SwapList_L(ToNode &L)///单链表的就地反转 { ToNode p=L->Next; L->Next=nullptr; ToNode r; r=nullptr; while(p->Next!=nullptr) { ToNode k=p->Next; p->Next=r; r=p; p=k; } p->Next=r; L->Next=p; } void printfList_(ToNode &L) { ToNode p=L->Next; while(p->Next!=nullptr) { cout<<(p->Data)<<" "; p=p->Next; } cout<<(p->Data)<<endl; } int main(void) { cin.tie(0);std::ios::sync_with_stdio(false); ToNode A;int num;cin>>num; CreateList_L(A,num);///头插 printfList_(A); SwapList_L(A); printfList_(A); return 0; }