昨天面试被问到单向循环链表的反转问题,以前没有考虑过这个问题,答得不是很好,晚上回去仔细想了想,又在网上找了找,总结出以下几种方法:
1、利用两个额外变量的情况:
node* reverse(node *head) { if(head == NULL || head->next == NULL) { return head; } node *cur = head; node *pre = NULL; node *tmp; while(cur->next) { tmp = pre; pre = cur; cur = cur->next; pre->next = tmp; } cur->next = pre; return cur; }
2、一个额外变量的情况:
void reverse(Node* a){ if(!a) printf(“Null”); Node* b = a->next; while(b && b->next != a) { a ^= b->next ^= a ^= b->next; a ^= b ^= a ^= b; } }
3、递归
List* ReverseList(List* oldList,List* newHead=NULL) { List* next=oldList->next; oldList->next=newHead; newHead=oldList; return (next==NULL) ? newHead : ReverseList(next,newHead); }