您的位置:首页 > 理论基础 > 数据结构算法

单链表_链表倒置

2016-07-10 20:56 190 查看
链表属于动态数据结构,可以类比成一“环”接一“环”的链条,这里每一“环”视作一个结点,结点串在一起形成链表。这种数据结构非常灵活,结点数目无须事先指定,可以临时生成。每个结点有自己的存储空间,结点间的存储空间也无需连接,结点之间的串连由指针来完成,指针的操作又极为灵活方便,无须移动大批数据,只需修改指针的指向。这是在编程中十分重要的一种数据类型。

我们把每一个结点只有一个指针域的链表称为单链表。单链表的每个结点的地址存放在其直接前驱结点的指针域中,第一个结点没有直接前驱结点,因此需要一个头指针指向第一个结点。由于链表中的最后一个元素没有直接后继元素,需要将单链表的最后一个结点的指针域置为“空”。

存取链表必须从头指针开始,头指针指向链表的第一个结点,通过头指针可以找到链表中的每一个元素。

为了操作方便,有时我们会在单链表的第一个结点之前增加一个结点,称为头结点。头结点的数据域可以存放入线性表的长度等信息,头结点的指针域存放第一个元素结点的地址信息,使其指向第一个元素结点。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息