单向链表逆转(带头结点)的两种方法
2018-02-25 16:57
1061 查看
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct Node { struct Node * next; int v; }; // 创建带头结点的单向链表 Node * getLinkList() { Node* head=new Node; Node* linkList = head; for(int i=0;i<10;i++){ Node *p = new Node; p->v = i; linkList->next = p; linkList = p; } linkList->next=NULL; return head; } // 创建临时链表,将新节点指向其前驱节点(注意带头结点问题) Node* reverse1(Node * p) { Node *p1=NULL,*t; p = p->next; //指向头结点的后继结点 while(p!=NULL){ t = new Node; //创建新节点 if(p1==NULL) t->next = NULL; else{ t->next = p1; t->v = p->v; } p1=t; //临时链表指向新节点 p = p->next; } //添加头结点 t = new Node; t->next = p1; p1 = t; return p1; } // 原地反转 Node* reverse2(Node * p) { p=p->next; Node* curNode=p,*nextNode=p->next,*t; while(nextNode!=NULL){ t = nextNode->next; //保存后继节点的后继节点 nextNode->next = curNode; //后继节点的next指针改为指向当前节点 curNode = nextNode; //当前节点更新为后继节点 nextNode = t; //指向原链表中下一个节点 } p->next = NULL; p = curNode; //添加头结点 t = new Node; t->next = p; p = t; return p; } int main() { Node * linklist = getLinkList(); Node *p = reverse2(linklist); //test while(p->next!=NULL){ cout<<p->next->v<<endl; p=p->next; } return 0; }
相关文章推荐
- 不带头结点的单链表反转 三种不同方法实现
- 两种链表的合并运算(一种带头结点的,一种不带头结点)
- 链表逆转的两种方法
- 带头结点的非循环单向链表
- 不带头结点的循环单向链表
- 两种链表的合并运算(一种带头结点的,一种不带头结点)
- 链表中删除结点的两种方法
- 单向不带头结点不带环的链表实现
- 带头结点的循环单向链表
- 建立一个带头结点的的单向链表并输出到out53.dat和屏幕上。各节点的值为对应的下表。链表的节点数及输出地文件名作为参数传入
- 两种方法实现单向链表的创建、遍历、删除、查找、逆序输出(循环法和递归法)
- python实现反向打印单向链表的两种方法
- 带头结点的单链表实现就地逆置的更优方法
- java 链表结点的删除的两种方法
- 不带头结点的单向链表排序——插入排序(C语言)
- 逆序带头结点的单向链表
- 线性表的链式存储结构_单向链表[带头结点]_C#实现
- 不带头节点链表逆序的两种方法
- 统计带头结点的单向链表的个数并存放在形参n所指的单元中。 欢迎评论 指点。
- 带头结点的单向链表