单链表_链表倒置
2016-07-10 20:56
190 查看
链表属于动态数据结构,可以类比成一“环”接一“环”的链条,这里每一“环”视作一个结点,结点串在一起形成链表。这种数据结构非常灵活,结点数目无须事先指定,可以临时生成。每个结点有自己的存储空间,结点间的存储空间也无需连接,结点之间的串连由指针来完成,指针的操作又极为灵活方便,无须移动大批数据,只需修改指针的指向。这是在编程中十分重要的一种数据类型。
我们把每一个结点只有一个指针域的链表称为单链表。单链表的每个结点的地址存放在其直接前驱结点的指针域中,第一个结点没有直接前驱结点,因此需要一个头指针指向第一个结点。由于链表中的最后一个元素没有直接后继元素,需要将单链表的最后一个结点的指针域置为“空”。
存取链表必须从头指针开始,头指针指向链表的第一个结点,通过头指针可以找到链表中的每一个元素。
为了操作方便,有时我们会在单链表的第一个结点之前增加一个结点,称为头结点。头结点的数据域可以存放入线性表的长度等信息,头结点的指针域存放第一个元素结点的地址信息,使其指向第一个元素结点。
单链表逆置
算法的核心就是reverse函数,其它的都是辅助建立链表和输出链表的。
从数据结构的定义来看这是一个带头节点的链表。要弄的十分明白你要耐心点画图看看。我简单的说下思路:
【head是指向头结点的】
p=head; //p最开始指向头结点
s=p->next; //s最开始指向第一个节点
while(s->next!=NULL)//只要没有到最后一个元素就继续。最后一个元素的next肯定为NULL
{ //进入核心了楼主
t=s->next; //用t指向s后面的那个元素
s->next=p; //把s指向她前面那个,这个时候就实现了逆向了。而且是就地逆向。元素都没有动的
p=s; //然后p向后移动s
s=t; //s向后移动到p
这样到下一轮的时候又可以讲下下个再指向刚才那个下一个。一次内推
}
s->next=p; //当最后一个的时候,还是要指向她的前一个。
head->next->next=NULL;//头指针的下一个是指向原来的第一个。逆向后肯定是最后的那个了。所以最后的一个的next=NULL就明了了。
head->next=s;//s是逆序前的最后一个,逆序后是第一个,所以用头指向他
我们把每一个结点只有一个指针域的链表称为单链表。单链表的每个结点的地址存放在其直接前驱结点的指针域中,第一个结点没有直接前驱结点,因此需要一个头指针指向第一个结点。由于链表中的最后一个元素没有直接后继元素,需要将单链表的最后一个结点的指针域置为“空”。
存取链表必须从头指针开始,头指针指向链表的第一个结点,通过头指针可以找到链表中的每一个元素。
为了操作方便,有时我们会在单链表的第一个结点之前增加一个结点,称为头结点。头结点的数据域可以存放入线性表的长度等信息,头结点的指针域存放第一个元素结点的地址信息,使其指向第一个元素结点。
#include <iostream> using namespace std; struct List { int num; List *next; }; //在下一行建立头指针 List *head; List *Create() { //从下一行开始构造单链表 List *p=NULL; List *q=NULL; head=NULL; for(int i=0;i<3;i++){ p=new List; cin>>p->num; if(head==NULL){ head=p; } else{ q->next=p; } q=p; } if(head!=NULL){ q->next=NULL; } return head; } void deleteNode(List *&head) { //在下面编写删除代码 int num; cin>>num; List *p=NULL,*q=NULL; p=head; if(p->num == num){ head=p->next; delete p; return ; } q=p->next; while(q!=NULL){ if(q->num ==num){ p->next=q->next; delete q; return ; } if(q->num>num){ return; } p=q; q=q->next; } return ; } void displayList(List *head) { while ( head != NULL ) { cout << head->num << endl; head = head->next; } } int main() { Create(); displayList(head); return 0; }
单链表逆置
算法的核心就是reverse函数,其它的都是辅助建立链表和输出链表的。
从数据结构的定义来看这是一个带头节点的链表。要弄的十分明白你要耐心点画图看看。我简单的说下思路:
【head是指向头结点的】
p=head; //p最开始指向头结点
s=p->next; //s最开始指向第一个节点
while(s->next!=NULL)//只要没有到最后一个元素就继续。最后一个元素的next肯定为NULL
{ //进入核心了楼主
t=s->next; //用t指向s后面的那个元素
s->next=p; //把s指向她前面那个,这个时候就实现了逆向了。而且是就地逆向。元素都没有动的
p=s; //然后p向后移动s
s=t; //s向后移动到p
这样到下一轮的时候又可以讲下下个再指向刚才那个下一个。一次内推
}
s->next=p; //当最后一个的时候,还是要指向她的前一个。
head->next->next=NULL;//头指针的下一个是指向原来的第一个。逆向后肯定是最后的那个了。所以最后的一个的next=NULL就明了了。
head->next=s;//s是逆序前的最后一个,逆序后是第一个,所以用头指向他
#include <iostream> using namespace std; struct List { int num; List *next; }; List *head; void reverse(int begin, int end, List *&head) { //在这个函数中编写你的代码 List * p,* q,* t; p=head; q=p->next; while(q->next!=NULL){ t=q->next; q->next=p; p=q; q=t; } } List *Create() { List *p = NULL; List *q = NULL; head = NULL; for ( int i = 0; i < 10; i++ ) { p = new List; p->num = i * 2; if ( head == NULL ) { head = p; } else { q->next = p; } q = p; } if ( head != NULL ) { q->next = NULL; } return head; } void displayList(List *head) { while ( head != NULL ) { cout << head->num; head = head->next; if ( head != NULL ) { cout << "->"; } } cout << endl; } int main() { Create(); int begin, end; cin >> begin >> end; reverse(begin, end, head); displayList(head); return 0; }
相关文章推荐
- [C/C++]反转链表
- C#数据结构之顺序表(SeqList)实例详解
- C#实现基于链表的内存记事本实例
- Lua教程(七):数据结构详解
- C#模拟链表数据结构的实例解析
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#实现单链表(线性表)完整实例
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C语言实现单链表逆序与逆序输出实例
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C语言单链表常见操作汇总
- 【数据结构与算法】数组应用4:多项式计算Java版