单项链表的原地反转

逻辑图如下所示:

只需要将需要反转的节点放到头节点位置即可,

使用两个指针一个指针指向需要反转的节点,另一个指针指向需要反转的指针的前驱节点(其实也就是元链表的头节点)

操作过程:

  • 1 2 3 4 5
  • 2 1 3 4 5
  • 3 2 1 4 5
  • 4 3 2 1 5
  • 5 4 3 2 1
cpp 复制代码
//单项链表的原地反转
/* 
 * 逻辑:
 * 使用两个指针 prev 和 pCur ,pCur是需要反转的结点,prev为需要反转的结点的前驱结点
 * prev的指针域指向需要反转结点的下一个结点
 * 将pCur反转到prev之前
 * 将头指针的next指向反转后的结点
 * pCur指向下一次需要反转的结点
 *
 * */

#include <stdio.h>
#include <stdlib.h>

#define TRUE   0
#define FALSE -1

typedef int ElemType;

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

//初始化
LinkList list_lnit()
{
    LNode *t;
    t = (LNode *)malloc(sizeof(LNode));
    t->next = NULL;

    LinkList head;
    head = t;
    return head;
}

//头插法
int head_insert(LinkList head,ElemType data)
{
    if(NULL == head)
        return FALSE;
    //创建一个新的结点
    LinkList p = (LinkList)malloc(sizeof(LNode));
    p->data = data;
    p->next = head->next;
    head->next = p;

    return TRUE;
}

//打印结点
int print_list(LinkList head)
{
    if(NULL == head)
        return FALSE;
    //使用一个指针对链表进行遍历
    LNode *t;
    t = head->next;
    while (t != NULL)
    {
        printf("%d ",t->data);
        t = t->next;
    }
    printf("\n");
    return TRUE;
}

//反转算法
LinkList reverse(LinkList head)
{
    if(NULL == head || NULL == head->next)
        return head;
    LNode *prev, *pCur;
    // prev 指向第一个数据结点
    prev = head->next;
    // pCur 指向第二个数据结点
    pCur = prev->next;

    if(pCur == NULL)//如果只有一个数据结点则不需要反转
        return head;
    
    while (pCur != NULL)
    {
        prev->next = pCur->next;
        pCur->next = head->next;
        head->next = pCur;
        pCur = prev->next;
        
    }

    return head;
}

int main()
{
    LinkList head;
    head = list_lnit();
    int i;
    for (i = 0; i < 5;i++){
        head_insert(head,100+i);
    }
    print_list(head);

    head = reverse(head);
    print_list(head);

    return 0;
}

运行结果:

相关推荐
ShineWinsu4 分钟前
对于数据结构:堆的超详细保姆级解析—上
数据结构·c++·算法·计算机·二叉树·顺序表·
时间醉酒2 小时前
数据结构:双向链表-从原理到实战完整指南
c语言·数据结构·算法
好学且牛逼的马3 小时前
【HOT100|1 LeetCode 1. 两数之和】
数据结构·算法·leetcode
麦烤楽鸡翅3 小时前
挡住洪水 (牛客)
java·数据结构·c++·python·算法·bfs·牛客
ʚ希希ɞ ྀ3 小时前
leeCode hot 100 !!!持续更新中
数据结构·算法·leetcode
Jeff-Nolan4 小时前
数据结构(c++版):邻接表的实现
数据结构·链表
wyiyiyi4 小时前
【数据结构+算法】进栈顺序推算、卡特兰数与逆波兰表达式
汇编·数据结构·笔记·算法
guguhaohao5 小时前
map和set,咕咕咕!
数据结构·c++
TL滕5 小时前
从0开始学算法——第二天(时间、空间复杂度)
数据结构·笔记·学习·算法
旺仔老馒头.7 小时前
【数据结构与算法】手撕排序算法(二)
c语言·数据结构·算法·排序算法