//如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
//所以必须要重构链表,才能满足输出为一个链表,而不仅仅是只求头指针
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL){
return pHead;
}
//声明翻转之后的头节点指针
ListNode * res = NULL;
//使用cur指向待翻转的头节点
ListNode * cur = pHead;
//声明一个ListNode类型的stack(栈)st
stack<ListNode*>st;
//使用while循环将待翻转链表逐个压入st中
while(cur!=NULL){
st.push(cur);
cur = cur->next;
}
//根据栈的特性,先进后出的特点
//栈顶元素就是我们要的指针
//关于为什么先top后pop参考网址:https://blog.csdn.net/qq_43230911/article/details/115030493
//因为top只是获取并未删除栈顶元素,而pop则删除栈顶元素
res = st.top();
//出栈这个栈顶元素
st.pop();
//使用pre接收新链表的头结点
ListNode * pre = res;
//构建新链表,将剩下的元素全部出栈
for (;st.size();st.pop()){
pre->next = st.top();
pre = pre->next;
}
//最后将新构建的链表的最后一位指向NULL
pre->next = NULL;
return res;
}
};
C++实现指针翻转(用栈实现)
于 2022-09-15 23:16:01 首次发布