定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
双指针法(迭代法)
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* create(){
ListNode *p, *pre, *head;
head = new ListNode(0);
pre = head;
for(int i=1; i<5; i++){
p = new ListNode(i);
pre->next = p;
pre = p;
}
return head;
}
ListNode* reverseList(ListNode* &head){
ListNode *pre, *cur;
pre = NULL;
cur=head;
while(cur!=NULL){
ListNode *q = cur->next;
cur->next = pre;
pre = cur;
cur = q;
}
return pre;
}
int main(){
ListNode *head = create();
ListNode *pp = reverseList(head);
while(pp!=NULL){
printf("%d ", pp->val);
pp = pp->next;
}
return 0;
}
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* create(){
ListNode *p, *pre, *head;
head = new ListNode(0);
pre = head;
for(int i=1; i<5; i++){
p = new ListNode(i);
pre->next = p;
pre = p;
}
return head;
}
ListNode* recur(ListNode *cur, ListNode *pre){
if (cur==nullptr) return pre;
ListNode *res = recur(cur->next, cur);
cur->next = pre;
return res;
}
ListNode* reverseList(ListNode* &head){
return recur(head, nullptr);
}
int main(){
ListNode *head = create();
ListNode *pp = reverseList(head);
while(pp!=NULL){
printf("%d ", pp->val);
pp = pp->next;
}
return 0;
}