博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DS-链表-0001-反转单链表

Posted on 2023-10-25 01:14  乔55  阅读(3)  评论(0编辑  收藏  举报

用递归的方法反转一个不头结点的单链表

// 定义单链表结点结构
typedef struct t_linkNode
{
    struct t_linkNode* next;
    int data;
}myNode;



// 用递归的方法反转链表
myNode* xxx_reverse(myNode* head)
{
    if (head == NULL || head->next == NULL)
    {
        return head;
    }
    
    // 先处理首结点外的所有结点链L1
    myNode* newhead = xxx_reverse(head->next);

    // 处理1链与首结点的关系
    head->next->next = head;
    head->next = NULL;
    return newhead;
}

// 定义打印链表的函数
void xxx_print(myNode* head)
{
    while (head != NULL)
    {
        cout << head->data << "-->";
        head = head->next;
    }
    cout << "NULL" << endl;
}

void test()
{
    // 创建不头结点的链表:5->4->3->2->1->NULL
    myNode p5{ NULL,5 };
    myNode p4{ &p5,4 };
    myNode p3{ &p4,3 };
    myNode p2{ &p3,2 };
    myNode p1{ &p2,1 };
    xxx_print(&p1);
    myNode* p = xxx_reverse(&p1);
    xxx_print(p);
}

用迭代的方法实现链表的反转

typedef struct t_linkNode
{
    struct t_linkNode* next;
    int data;
}myNode;

// 迭代方法实现链表反转
// 1、先创建辅助指针,辅助指针永远指向head的下一结点:ptemp=head.next;
// 2、再创建指向新链表的指针,刚开始时pNew指向空:pNew=NULL;
// 3、当head!=NULL时,循环以下操作
//    01、将原链表首结点摘出来,将其插入pNew链表首元结点位置
//    02、完成头插后更新:pNew=head;head=ptemp;ptemp=ptemp.next;
myNode* xxx_reverse_1(myNode* head)
{
    if (head == NULL || head->next == NULL)
    {
        return NULL;
    }

    // 创建辅助指针ptemp,用来记录原链表次元结点
    // 创建新链表指针pNew,初始值为空链表,故pNew初始值为NULL
    myNode* ptemp = head->next;
    myNode* pNew = NULL;

    // 当原链表仍存在结点,则进行以下循环操作
    while (head != NULL)
    {
        // 将head首元结点摘下,并将其头插至新链表pNew
        head->next = pNew;
        

        // 更新pNew,head,ptemp的值
        pNew = head;
        head = ptemp;
        if (ptemp != NULL)
        {
            ptemp = ptemp->next;
        }
    }
    return pNew;
}