单链表反转C++

main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <string.h>
#include <time.h>

#include <unistd.h>

#define TRUE (0)
#define FALSE (0)

typedef int ElemType;
typedef char BOOL;

typedef struct LNode{
    LNode *next;
    ElemType data;
}LinkNode;

class CList
{
private:
    LinkNode *m_pRoot;

public:
    CList();
    ~CList();

    BOOL AddNode(const ElemType &rstData);
    void TravelAll();
    void Destroy();
    void Reverse();
};

CList::CList()
{
    m_pRoot = NULL;
}

CList::~CList()
{
    Destroy();
}

void CList::TravelAll()
{
    if(m_pRoot == NULL)
    {
        printf("list is empty!\n");
    }

    LinkNode* pHead = m_pRoot;
    while(pHead)
    {
        printf("%d ", pHead->data);
        pHead = pHead->next;
    }
    printf("\n");
}

void CList::Destroy()
{
    while(m_pRoot)
    {
        LinkNode* pTmp = m_pRoot;
        m_pRoot = m_pRoot->next;
        if(pTmp)
        {
            free(pTmp);
            pTmp = NULL;
        }
    }
}

BOOL CList::AddNode(const ElemType &rstData)
{
    if(m_pRoot == NULL)
    {
        m_pRoot = (LinkNode*)malloc(sizeof(LinkNode));
        
        if(m_pRoot == NULL)
        {
            printf("malloc failed!, errno=%d, errmsg=%s\n", errno, strerror(errno));
            return FALSE;
        }
        m_pRoot->data = rstData;
        m_pRoot->next = NULL;
        return TRUE;
    }

    LinkNode* pHead = m_pRoot;
    while(pHead->next) pHead = pHead->next;

    LinkNode *pNewNode = (LinkNode*)malloc(sizeof(LinkNode));
    if(pNewNode == NULL)
    {
        printf("malloc failed, errno=%d, errmsg=%s\n", errno, strerror(errno));
        return FALSE;
    }

    pNewNode->next = NULL;
    pNewNode->data = rstData;

    pHead->next = pNewNode;
    
    return TRUE;
}


// 单链表反转
void CList::Reverse()
{
    // 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

    if(m_pRoot == NULL || m_pRoot->next == NULL)
    {
        return;
    }

    LinkNode* pCurPos = m_pRoot->next;
    LinkNode* pHead = m_pRoot;
    LinkNode* pPrev = pHead;
    
    while(pCurPos)
    {
        LinkNode* pNextPos = pCurPos->next;

        pPrev->next = pCurPos->next;
        pCurPos->next = pHead;

        pHead = pCurPos;
        pCurPos = pNextPos;
        //TravelAll();
    }
    m_pRoot = pHead;
}


int main(int argc, char *argv[])
{
    srand(time(0));

    CList list;
    
    for(int i=0;i<10;i++)
    {
        int tmp = rand()%256;

        list.AddNode(i+1);
        
    }
    list.TravelAll();

    list.Reverse();

    list.TravelAll();

    return 0;
}




Makefile

CC=g++
SRC=$(wildcard *.cpp)
OBJS=${SRC:%.cpp=%.o}
EXE=linklist

all:
	@echo "src:${SRC}, objs:${OBJS}"
	${CC} -c ${SRC}
	${CC} -o ${EXE} ${OBJS}
clean:
	rm -f ${OBJS} ${EXE}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值