题意思路:
输入一个链表,反转链表后,输出新链表的表头。
方法一:调整链表指针,反转链表
pre指针指向已经反转好的链表的最后一个节点,初始化为null;
cur指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向头指针;
next指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存
图解:
复杂度分析
时间复杂度:O(N),N链表的长度,遍历链表;
空间复杂度:O(1),未开辟新空间.
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode *pre=NULL;//pre指针指向已经反转好的链表的最后一个节点,初始化为null;
ListNode *cur=pHead;//cur指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向头指针;
ListNode *next=NULL;//next指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存
while(cur){
next=cur->next;//next保存待反转指针的第一个节点
cur->next=pre;//cur的第一个节点保存已经反转好的链表的最后一个节点
pre=cur;//已经反转好的链表的最后一个节点保存待反转链表的第一个节点
cur=next;//待反转链表的第一个节点为反转指针的第一个节点
}//使指针反转
return pre;
}
};方法二:栈
利用栈先进后出的性质达到反转的目的
复杂度分析
时间复杂度:O(N),N链表的长度,遍历链表;
空间复杂度:O(N),栈存储与读取链表节点数据。
代码:
/*
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;
ListNode *cur=pHead;
stack<ListNode*>st;
while(cur!=NULL){//将链表push栈中
st.push(cur);//利用栈先进后出的性质达到反转的目的
cur=cur->next;
}
res=st.top();
st.pop();
ListNode *pre=res;
for(;st.size();st.pop()){//构建链表
pre->next=st.top();
pre=pre->next;
}
pre->next=NULL;//最后一个节点的下个指针指向NULL
return res;
}
};
京公网安备 11010502036488号