单向循环链表反转

昨天面试被问到单向循环链表的反转问题,以前没有考虑过这个问题,答得不是很好,晚上回去仔细想了想,又在网上找了找,总结出以下几种方法:

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); }

点赞