逆转链表

来源:互联网 发布:数据库管理系统的是 编辑:程序博客网 时间:2024/06/05 15:44

利用三个节点:

第一个节点用于返回,也就是新的链表头节点;

第二个节点是当前节点,第三个节点是当前节点的next节点

code如下

/*  * Copyright (c) 2011 alexingcool. All Rights Reserved.  */ #include <iostream>using namespace std;int array[] = {5, 7, 6, 9, 11, 10, 8};const int size = sizeof array / sizeof *array;struct Node{Node(int i = 0, Node *n = NULL) : item(i), next(n) {}int item;Node *next;};Node* construct(int (&array)[size]){Node dummy;Node *head = &dummy;for(int i = 0; i < size; i++) {Node *temp = new Node(array[i]);head->next = temp;head = temp;}return dummy.next;}Node* reverse(Node *head){if(head == NULL) {cout << "link is null" << endl;return NULL;}Node *newHead = NULL, *pHeadNext = head;while(pHeadNext) {head = pHeadNext;pHeadNext = pHeadNext->next;head->next = newHead;newHead = head;}return newHead;}void reverse2(Node *root, Node* &head, Node* &tempHead){if (root == NULL)return;reverse2(root->next, head, tempHead);if (head == NULL){head = root;tempHead = head;}else{tempHead->next = root;tempHead = root;tempHead->next = NULL;}}void print(Node *head){while(head) {cout << head->item << " ";head = head->next;}}void main(){Node *head = construct(array);cout << "source link: ";print(head);cout << endl;Node *newHead2 = NULL;Node *tempHead = NULL;reverse2(head, newHead2, tempHead);print(newHead2);cout << endl;}

逆转链表最优雅的循环解法:

Node* reverse(Node *head){if(head == NULL) {cout << "link is null" << endl;return NULL;}Node *previous = NULL, *pHead = head;while(pHead) {Node *temp = pHead->next;pHead->next = previous;previous = pHead;pHead = temp;}return previous;}

优雅的递归算法:


Node* reverseLink(Node *link){if (link->next == NULL) {return link;}Node *node = reverseLink(link->next);Node *ptr = link->next;link->next = link->next->next;ptr->next = link;return node;}


Node* reverseLink(Node *head){if (head == NULL || head->next == NULL)return head;Node *node = reverseLink(head->next);head->next->next = head;head->next = NULL;return node;}