【 数据结构(C语言)】线性表——链表反转

方法1:使用3个指针遍历单链表,逐个结点进行反转。

方法2:从第2个节点到第N个节点,依次逐节点插入到第head节点之后(针对有。

法一:逐个结点反转

1)将指针a,b,c依次赋值为连续的三个指针

【 数据结构(C语言)】线性表——链表反转

2)原链表的第一个结点翻转后为最后一个结点,将原链表的第一个结点的next 赋值NULL

 【 数据结构(C语言)】线性表——链表反转

3)把b->next 赋值为a,改变指针方向; 将b 赋值为 c,a赋值为b,c赋值为c->next ,边界条件:赋值后的a 为空时,L->next = a; 更新新的表头

【 数据结构(C语言)】线性表——链表反转

LinkList ListReverse(LinkList &L)
{
    LinkList a = L->next;
    LinkList b = a->next;
    LinkList c = b->next;
    a->next = NULL;
    int len = GetLength(L);
    while (len--)
    {
        b->next  = a;
        c = b;
        b = a;
        if(!a)
        {
            L->next=a;
        }
        else c=c->next;
    }
    return L;
}

法二:依次插入到头结点之后(代码针对有头结点的链表)

如果是没有头结点的链表,从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,(N-1)次这样的操作结束之后将第1个节点挪到新表的表尾即可

【 数据结构(C语言)】线性表——链表反转

LinkList ListReverse2(LinkList &L)
{
    int num;
    for (int i=2; i <= GetLength(L); i++)
    {
        ListDeteleByPos_L(L,i,num);
        ListInsert_L(L,1,num);
    }
    return L;
}