单链表反转

来源:互联网 发布:js写贪吃蛇 编辑:程序博客网 时间:2024/06/11 07:34

这里给出用C++实现单链表反转的两种方法:

1、新建一个空的单链表,依次读取原链表的节点并插入新链表的开头

2、翻转节点的指针指向,使其指向各自的前驱节点

以下是具体实现:

#include <iostream>using namespace std;struct Node {int data;Node* next;Node(int val): data(val), next(NULL) {}};class LinkList {private:Node* head;public:LinkList(): head(NULL) {}void display();void reverse1();void reverse2();void insert(int value);};void LinkList::display() {for (Node* i = head; i; i = i->next)cout << i->data;cout << endl;}void LinkList::reverse1() {//方法1if ( (head == NULL) || (head->next == NULL)) //若链表为空或只有一个节点,返回return;Node* newList = new Node;newList->data = head->data; //复制原链表第一个节点的值newList->next = NULL;while (head->next != NULL) {//从第二个节点开始依次读取节点,插入新链表Node* tmp = newList;newList = head->next;head->next = head->next->next;//将插入到新链表中的节点删除newList->next = tmp;}while (head) {//释放原链表内存Node* tmp = head->next;delete head;head = tmp;}head = newList;}void LinkList::reverse2() {//方法二if ( (head == NULL) || (head->next == NULL) ) //若链表为空或只有一个节点,返回return;Node* cur = NULL, next;while (head != NULL) {next = head->next; //保存当前节点的下一个节点head->next = cur; //使当前节点的next指向前驱节点cur = head; //前驱节点指针向后移动head = next; //当前节点指针向后移动}head = cur;}void LinkList::insert(int value) {if (head == NULL) {head = new Node(value);} else {Node* tmp = head;head = new Node(value);head->next = tmp;}}int main(){LinkList ll;ll.insert(0);ll.insert(1);ll.insert(2);ll.insert(3);ll.insert(4);ll.insert(5);ll.insert(6);ll.insert(7);ll.insert(8);ll.insert(9);ll.display();ll.reverse1();ll.display();ll.reverse2();ll.display();return 0;}