翻转链表

思路:

(1)从头结点开始,p=L->next,然后从p开始,依次翻转p与p的前一个节点的指针的方向。

(2)提前记录p的next节点,因为指针变换后不会再指向下一个。

(3)令p的next指向p前面的节点。

(4)记录当前p指针,为下一次改变指针方向做准备。

(5)考虑头结点的情况,如果指针p的前一个节点是头结点,则指向NULL。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct Node{
    int data;
    struct Node* next;
};
typedef struct Node* List;

List CreateList()
{
    List L=(List)malloc(sizeof(struct Node));
    L->next=NULL;
    return L;
}

void Insert(int x,List L,List p)
{
    List tp=(List)malloc(sizeof(struct Node));
    tp->data=x;
    tp->next=p->next;
    p->next=tp;
}

void Reverse(List L)
{
    List tp,p=L->next,pre;
    while(p!=NULL)
    {
        tp=p->next;
        if(p==L->next) p->next=NULL;
        else p->next=pre;
        pre=p;
        p=tp;
    }
    L->next=pre;
}

void Print(List L)
{
    List p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("
");
}

int main(void)
{
    int n,i,x;
    List L=CreateList(),p;
    p=L;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>x;
        Insert(x,L,p);
        p=p->next;
    }
    Print(L);
    Reverse(L);
    Print(L);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/2018zxy/p/10041100.html