单链表_链表倒置

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

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

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

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

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值