反转链表
507 字
3 分钟
反转链表

反转链表
递归反转链表
递归反转链表的思想是,递归到链表末尾,再从尾至头得反转链表指针
递归的好处就是比迭代法代码量少,且更读易懂。坏处就是容易爆栈,在主流的语言中一般递归个几千层就会爆栈
首先我们需要创建一个函数,我们只需要向其传递一个值,就是指向链表头的指针
void Reverse(Linked* p){}然后再判断这个指针非空,并递归到末尾
void Reverse(Linked* p){ if(p -> next == nullptr){ return; } re(p -> next)}假设我们有个一个全局变量head,那就让其指向末尾元素
void Reverse(Linked* p){ if(p -> next == nullptr){ head = p; return; } Reverse(p -> next);}随后再从后往前遍历,让后面的元素指向前面的元素
void Reverse(Linked* p){ if(p -> next == nullptr){ head = p; return; } Reverse(p -> next); Linked* q = p -> next; //定义q表示下一位元素 q -> next = p; //使后面的元素指向前面的元素 p -> next = nullptr; //把当前元素指针归零,如果是第一位元素则反转后不指向任何元素,如果不是则没有影响}迭代反转列表
首先我们还是需要创建一个函数,但我们不需要往里面传递值了,直接调用全局变量就好
void Reverse(){}我们需要遍历链表并反转其指针
void Reverse(){ Linked* p = head; while(next != nullptr){ p = p -> next; }}但我们发现要是直接反转链表的话,下一位元素就会丢失,并且链表也没办法传递上一位的值,所以我们需要额外的两个变量来存储上一位和下一位
void Reverse(){ Linked* last,current,next; //分别表示上一位,这一位和下一位 current = head; last = nullptr; while(current != nullptr){ next = current -> next; current -> = last; last = current; current = next; //整体前移 } head = last; //使头部指向末尾}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!












