链表的翻转
输入一个链表,反转链表后,输出链表的所有元素。
struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };
方法一:建立节点指针类型堆栈,遍历链表,将指针压栈,顺次出栈,实现反转。这个占用内存空间较大。
ListNode* ReverseList(ListNode* pHead) { //把链表中的元素的值首先存入一个栈中 //从栈中一个一个的读出数据插入list中 if(pHead==NULL) return NULL; stack<int> st; ListNode *list=pHead; //入栈 while(list!=NULL) { st.push(list->val); list=list->next; } //创建链表list list=pHead; if(list!=NULL) { while(!st.empty()) { list->val=st.top(); st.pop(); list=list->next; } } else//末尾结点的next指针指向NULL list->next=NULL; return pHead; }
思路2:依次遍历链表,改变节点的指向,注意之前要将下一个节点的地址赋值给一个指针next保存。
事实上,next指针表示去掉已经反转的链表的第二个节点,pre指针表示反转过的链表表头,pHead指针表示去掉已经反转的链表的表头。
ListNode* ReverseList(ListNode* pHead) { if(pHead==NULL) return NULL; ListNode* pre=NULL;//前一个节点 ListNode* pNext=NULL;//下一个节点(为了保存) while(pHead!=NULL) { pNext=pHead->next;//下一个节点的引用 pHead->next=pre;//当前节点对下一个节点的引用指向前一个节点 pre=pHead;//前一个节点指向当前节点 pHead=pNext;//将当前节点指向下一个节点 } return pre; }
每天明白一点知识