C++实现单链表反转

一.写在前面的话:

找工作必须是全方位重点突击,准备工作可以从两方面着手,第一是公司的笔试环节,应该注重刷题。第二是公司的面试环节,对自己写在简历上的东西一定要熟悉,主要以项目中所涉及到的C++编程技术为主。

二.今日份编程练习

《C++实现单链表的反转》

实现思路:

1.如果单链表为空或者只有一个元素,那么就直接返回。

2.设置两个前后相邻的指针p,q,将p指针所指向的节点作为q所指向的节点的后继;

3.重复步骤2,直到q=NULL;

4.调整链表头和链表尾。

三.手写代码

#include
#include
using namespace std;

typedef struct listnode
{
    int data;
    listnode *next;
}listnode,*list;


void print(list head);
list reverse(list head);
list fill(list head);


int main()
{
    listnode *head;
    head=(listnode*)malloc(sizeof(listnode));
    
    //对头节点中的两个参数进行初始化工作 
    head->data=-1; 
    head->next=NULL;
    
    //建立一个单链表并对其进行初始化工作 
    list linklist=fill(head);
    
    //输出单链表 
    print(linklist);
    
    //反转单链表
    reverse(linklist);
    
    //输出翻转后的单链表
    print(linklist);
    
    getchar();
    return 0;
     
}

//实现单链表反转函数 
list reverse(list head)
{
    //判断单链表head是否为空或者单链表中只有一个元素 ,如果是则直接返回 head 
    if(head->next==NULL||head->next->next==NULL)
    {
        return head;
    }
    list t=NULL;
    list p=head->next;
    list q=head->next->next;
    
    //进行反转操作 
    while(q!=NULL)
    {
        t=q->next;
        q->next=p;
        p=q;
        q=t;
    }
    
    //调整头节点
    head->next->next=NULL;//设置链表尾 
    head->next=p;//设置链表头 
    return head;
    
}

//实现单链表的初始化:采用尾部追加节点的方法 
list fill(list head)
{
    listnode *p,*q;
    p=head;
    for(int i=0;i<10;i++)
    {
        q=(listnode*)malloc(sizeof(listnode));//分配空间
         
        q->data=i+1;//赋值 
        q->next=NULL;//指定下一个节点为空 
        p->next=q;
        p=q;
        
        
    }
    return head; 

//打印出节点的元素 
void print(list head)
{
    list p=head;
    p=p->next;
    while(p!=NULL)
    {
        cout<data<<"  ";
        p=p->next;
    }
    cout<      

四.输出结果:

C++实现单链表反转_第1张图片

 

你可能感兴趣的:(FindWork)