单链表的逆置

  • 用三个指针来实现
    s:用来建立新的链表
    p:找到下一个要放在头部的结点
    l:存放上一个结点的地址

在这里插入图片描述


  • 传节点的时候不能传insertBefore(m2, m2->next, n),像这种传节点+节点后继节点的方式,改链的时候会发生错误,具体例子如下代码
#include <iostream>
#include <stdlib.h>
#include <list>
using namespace std;
typedef struct Linklist {
    int data;
    struct Linklist *next;
}*Lnode, Linklist;
//单链表首指针为f,在节点p之前插入节点s,给出其算法
Lnode insertBefore(Lnode &f, Lnode &p, Lnode &s) {
    Lnode x = f;
    if (f != p) {
        while ((x->next != p) && (x->next != NULL)) {
            x = x->next;
        }
        x->next = s;
        s->next = p;
    }
    else {
        s->next = p;
        f = s;
    }
    return f;
}
int main() {
    Lnode s, m1, m2;
    s = (Lnode)malloc(sizeof(Lnode));
    m1 = s;
    m2 = s;
    for (int i = 1; i < 5; i++) {
        s->data = i;
        s->next = (Lnode)malloc(sizeof(Lnode));
        s = s->next;
    }
    s->data = 5;
    s->next = NULL;
    Lnode n = (Lnode)malloc(sizeof(Lnode));
    n->data = 100;
    Lnode m22 = m2->next;
    //传节点的时候不能传insertBefore(m2, m2->next, n)
    //在改变节点连接的时候,需要将->next的指针指向新开辟的节点,这样才能在断链的时候,保留节点情况
    m2 = insertBefore(m2, m22, n);  //添加
    for (int i = 1; i < 7; i++) {
        cout << m2->data << endl;
        m2 = m2->next;
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值