leetcode简单 链表题汇总

21. 合并两个有序链表



#include <iostream>
#include <math.h>
#include<algorithm>

using namespace std;
#define StackInitSize 100

#define MaxSize 100;
//链表
typedef int ElementType;

typedef struct LNode{
    ElementType data;
    struct LNode *next;
    
}Linklist;

Linklist *Init()//输入链表长度
{
    Linklist *p=(Linklist*)malloc(sizeof(Linklist));//创建一个头结点
    Linklist *temp=p;//指针temp指向头结点用于遍历链表
    do{
        Linklist *a=(Linklist*)malloc(sizeof(Linklist));
        cin>>a->data;
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
        
    }while(getchar()!='\n');
    
    return p;
    
    
    
}

void display(Linklist *p)
{
    Linklist *temp=p;
    
    while(temp->next)
    {
        temp=temp->next;
        cout<<temp->data<<" ";
    }
    cout<<endl;
}

int selectElm(Linklist *p,ElementType elem)//找出elem元素的位置
{
    Linklist *t=p;
    int i=1;
    while(t->next)
    {
        t=t->next;
        if(t->data==elem)
        {
            return i;
        }
        i++;
    }
    return -1;
}

//-----
/*
Linklist *change_elem(Linklist *p,int pos,ElementType elem)
{
    Linklist *temp=p;
    temp=temp->next;//temp指向首元素结点
    
    for(int i=0;i<pos;i++)
    {
        temp=temp->next;
    }
    temp->data=elem;
    return p;
}

*/
//------insert
Linklist *insert_elem(Linklist *p,ElementType elem,int add)
{
    Linklist *temp=p;
    for(int i=0;i<add;i++)
    {
        if(temp==NULL)
        {
            cout<<"插入位置无效\n";
        }
        temp=temp->next;
    }
    Linklist *c=(Linklist *)malloc(sizeof(Linklist));
    c->data=elem;
    c->next=temp->next;
    temp->next=c;
    
    return p;
    
    
}

Linklist *delete_elm(Linklist *p,int pos)
{
    Linklist *temp=p;
    
    for(int i=0;i<pos;i++)
    {
        temp=temp->next;
    }
    
    Linklist *c=temp->next;
    temp->next=temp->next->next;
    free(c);
    
    return p;
    
}

Linklist *teil(Linklist *p,ElementType elem)
{
    Linklist *temp=p;
    while(temp->next)
    {
        temp=temp->next;
    }
    Linklist *c=(Linklist*)malloc(sizeof(Linklist));
    c->data=elem;
    c->next=temp->next;
    temp->next=c;
    
    return p;
}


Linklist* mergeTwoLists(Linklist* l1, Linklist* l2){
    //Linklist *p1=(Linklist *)malloc(sizeof(Linklist));
    //Linklist *p2=(Linklist *)malloc(sizeof(Linklist));
    Linklist *res=(Linklist *)malloc(sizeof(Linklist));
    res->next=NULL;
    Linklist *temp=l1;
    Linklist *temp2=l2;
    
    int i=0;
    temp2=temp2->next;
    temp=temp->next;
    while(temp2!=NULL&&temp!=NULL)
    {
        
        if(temp->data < temp2->data)
        {
            teil(res, temp->data);
            
            //insert_elem(res, temp->data, i++);
            temp=temp->next;
        }
        else
        {
            teil(res, temp2->data);
            
            //insert_elem(res, temp2->data, i++);
            temp2=temp2->next;
        }
        
    }
    
    if(temp!=NULL)
    {
        while(temp!=NULL)
        {
            teil(res, temp->data);
            temp=temp->next;
        }
    }
    
    if(temp2!=NULL)
    {
        while(temp2!=NULL)
        {
            teil(res, temp2->data);
            temp2=temp2->next;
        }
    }
    
    return res;
    
};

int main()
{
    Linklist *l1=Init();
    Linklist *l2=Init();
    display(mergeTwoLists(l1, l2));
    //display(l1);
    //display(l2);
    
    return 0;
}



141. 环形链表(tbc)


206. 反转链表

思路:

把链表的数逐一放入数组
再反向遍历数组,逐个插入一个新链表中。

#include <iostream>
#include <math.h>
#include<algorithm>

using namespace std;
#define StackInitSize 100

#define MaxSize 100;
//链表
typedef int ElementType;

typedef struct ListNode {
     int val;
     struct ListNode *next;

     
 }Linklist;



 Linklist *Init()//输入链表长度
{
    Linklist *p=(Linklist*)malloc(sizeof(Linklist));//创建一个头结点
    Linklist *temp=p;//指针temp指向头结点用于遍历链表
    do{
        Linklist *a=(Linklist*)malloc(sizeof(Linklist));
        cin>>a->val;
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
        
    }while(getchar()!='\n');
    
    return p;
    
    
    
}
void display(Linklist *p)
{
    Linklist *temp=p;
    
    while(temp->next)
    {
        temp=temp->next;
        cout<<temp->val<<" ";
    }
    cout<<endl;
}

Linklist *head_insert(Linklist *p,ElementType elem)
{
    Linklist *temp=p;
    while(temp->next)
    {
        temp=temp->next;
    }
    Linklist *c=(Linklist*)malloc(sizeof(Linklist));
    c->val=elem;
    c->next=temp->next;
    temp->next=c;
    
    return p;
}



 ListNode* reverseList(ListNode* head){
     Linklist *p=head;
     Linklist *p1=head;
     Linklist *p2=head;
     p=p->next;
     p1=p1->next;
     p2=p2->next;
     Linklist *q;
     q=(Linklist*)malloc(sizeof(Linklist));
     q->next=NULL;
     
     
     int count1=0;
     
     while(p!=NULL)
     {
         //head_insert(q,p->val);
         
         count1++;
         p=p->next;
     }
     //cout<<"count1="<<count1<<endl;
     int a[count1];
     int i=0;
     while(p1!=NULL)
         
     {
         a[i]=p1->val;
         i++;
         //cout<<"-"<<p->val<<"   ";
         p1=p1->next;
     }
     
     
     count1--;
     while(p2!=NULL)
     {
         head_insert(q, a[count1--]);
         p2=p2->next;
     }
     
     return q;
    
}


int main()
{
    ListNode *l1,*l2;
    l1=Init();
    l2=reverseList(l1);
    display(l2);
    
    return 0;
}



234. 回文链表

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值