求c程序反转链表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求c程序反转链表相关的知识,希望对你有一定的参考价值。

如题,越具体越好

原理很简单 写个循环 1.三个链表指针变量 (前一个(初始0),当前的(初始head),后一个(初始为0))2.写一个循环while(当前的不为空) 3把后一个设置成当前的next4.把当前的next改成前一个5把前一个改成当前的6.把当前的改成后一个 比较基本的数据结构算法#include "stdafx.h"typedef struct LinkTable

LinkTable * Next;
int data;
lt,*plt;
void _print(plt phead);
plt reP(plt phead);int _tmain(int argc, _TCHAR* argv[])

plt p=NULL;
plt phead;for(int i=0;i<10;i++)

if(!p)

p=new lt;
p->data=i;
phead=p;
i++;

p->Next=new lt;
p=p->Next;
p->data=i;
p->Next=NULL;



_print(phead);phead=reP(phead);
_print(phead);
getchar();
return 0;
plt reP(plt phead)

plt pr=0;
plt pn=0;
plt pc=phead;
while(pc!=0)

pn=pc->Next;
pc->Next=pr;
pr=pc;
pc=pn;
return pr;
void _print(plt phead)

plt p=phead;
while(p!=0)

printf("%d \\n",p->data);
p=p->Next;
printf("phead %d \\n",phead->data);
参考技术A 给你个思路吧:先求得链表的大小,建一个相同大小的数组,遍历链表,将其值保存到数组中(正序),让后在遍历一次链表,从数组末尾开始对链表赋值(逆序)。 参考技术B 我也给个思路吧,多设两个结构体指针变量sp1(存储上一个结点指针),sp2(存储下一个结点指针),把现在所在的结点的next指针赋值给sp2,然后把sp1赋值给next,把sp2再赋值给sp1,然后取得sp2的指针进入下一个结点,重复这个过程
注意:在初始的时候sp1和sp2都为NULL

2021春季每日一题 week1 未完结

92. 反转链表 II【难度: 中 / 知识点: 链表】

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) 
    {
        ListNode* p=new ListNode(-1); p->next=head;
        ListNode* ans=p;
        for(int i=0;i<left-1;i++) p=p->next;
        auto a=p->next,b=a->next;
        for(int i=0;i<right-left;i++)
        {
            auto temp=b->next;
            b->next=a;
            a=b;
            b=temp;
        }
        p->next->next=b;
        p->next=a;
        return ans->next;
    }   
};

35. 反转链表【难度: 中 / 知识点: 链表】

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
       ListNode *ans=nullptr;
       while(head)
       {
           auto temp=head->next;
           head->next=ans;
           ans=head;
           head=temp;
       }
       return ans;
    }
};

1603. 设计停车系统 【难度: 简单 / 知识点: 模拟】

class ParkingSystem {
public:
    vector<int> cnt;
    ParkingSystem(int big, int medium, int small) 
    {
        cnt={big,medium,small};
    }
    
    bool addCar(int carType) {
        int t=carType-1;
        if(cnt[t]>=1)
        {
            cnt[t]--;
            return true;
        }
        return false;
    }
};

/**
 * Your ParkingSystem object will be instantiated and called as such:
 * ParkingSystem* obj = new ParkingSystem(big, medium, small);
 * bool param_1 = obj->addCar(carType);
 */

3267. 小明上学【难度: 简单 / 知识点: 模拟】

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int r,y,g; cin>>r>>y>>g;
    int n; cin>>n;
    int sum=0;
    while(n--)
    {
        int k,s;  cin>>k>>s;
        if(k==3) continue;
        else if(k==1)  sum+=s;
        else if(k==2)  sum+=r+s;
        else sum+=s;
    }
    cout<<sum<<endl;
    return 0;
}

150. 逆波兰表达式求值【未完成】

3302. 表达式求值【未完成】

73. 矩阵置零 【难度: 一般 / 知识点: 思维 】

class Solution {
public:
    void setZeroes(vector<vector<int>>& ve) 
    {
        map<int,int>mp1,mp2;
        for(int i=0;i<ve.size();i++)
        {
            for(int j=0;j<ve[i].size();j++)
            {
                if(!ve[i][j]) mp1[i]++,mp2[j]++;
            }
        }
        for(int i=0;i<ve.size();i++)
        {
            for(int j=0;j<ve[i].size();j++)
            {
                if(mp1[i]||mp2[j]) ve[i][j]=0;
            }
        }
    }
};

3174. 旋转【难度:简单 / 知识点: 找规律】

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int a[N][N],b[N][N],n,m;
int main(void)
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) b[j][n-i+1]=a[i][j];
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++) cout<<b[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

以上是关于求c程序反转链表的主要内容,如果未能解决你的问题,请参考以下文章

c++反转链表

链表小题(反转链表 求倒数第k个结点 删除链表指定结点)

c语言,链表的反转,请写出代码,并讲解下,谢了!!!!!

反转链表

C语言实现反转链表 II(指定2个节点反转)

LC206-反转链表