反转链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
stack<ListNode*> s; //定义一个反转栈
while(head){
s.push(head);
head = head->next;
}
ListNode *res = NULL;
if(!s.empty()){
res = s.top();
res->next = NULL;
s.pop();
} else{
return res;
}
ListNode *he = res;
while(!s.empty()){
he->next = s.top();
s.top()->next = NULL;
he = he -> next;
s.pop();
}
return res;
}
};
解法一:把整个链表倒进栈里然后取出来就是一个反转的链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = NULL, *pre = head;
while (pre != NULL) {
ListNode* t = pre->next;
pre->next = cur;
cur = pre;
pre = t;
}
return cur;
}
};
解答二:设立两个指针然后将前一个的next转化后后一个,t用来存储pre的节点。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* ret = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return ret;
}
};
解法三:别人的递归解法,前四步是递归然后 到第五步开始回溯 然后第四个节点的head是当前的第四个节点 然后把第四个节点的next也就是第五个节点的next设为第四个节点 然后把第四个节点设为空 然后回溯下去