链表数据结构
struct node { string value; node *next = NULL; };
单链表的反转
用指针pre、cur、next分别指向前一个节点、当前节点、后一个节点,我们的目标是将cur节点的next指针指向pre,这样便反转了,当然在反转之前需要记住原先cur节点的next指针所指向的节点。
node * reverse(node * head) { node* pre = NULL; node* cur = head; node* next; while(cur) { next = cur->next; cur->next = pre; pre = cur; cur = next; } return pre; }
每k个节点进行反转,不足k个节点不反转
如:1->2->3->4->5->6->7->8,k=3;
结果:3->2->1->6->5->4->7->8
node* reverseKnode(node* head,int k) { node* newRoot = new node; node* pre = newRoot; node* cur = head; node* start = head; node* end = head; node* next = head; while(next) { for(int i=1;i<k && end!=NULL;i++) { end = end->next; } if(end == NULL)//没有这句话就是不足k个节点也会反转 { break; } cout<<end->value<<endl; next = end->next; end->next = NULL; node* newStart = reverse(start); node* newEnd = start; pre->next = newStart; newEnd->next = next; start = next; pre = newEnd; end = start; } return newRoot->next; }
