ListNode* ReverseList(ListNode* pHead)
{
ListNode* pReverseNode = NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while(pNode != NULL)
{
ListNode* pNext = pNode->m_pNext;
if(pNext == NULL)
pReverseNode = pNode;
pNode->m_pNext = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReverseNode;
}
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node * pNext;
}NODE,* PNODE;
PNODE link_create();
void link_show(PNODE );
bool link_insert(PNODE phead,int pos,int val);
bool link_delete(PNODE phead,int pos);
PNODE ReverseLink(PNODE pHead);
void link_reshow(PNODE phead);
int main()
{
PNODE pstart = link_create();
PNODE preverse;link_show(pstart);
link_insert(pstart,3,900);
link_show(pstart);
link_delete(pstart,3);
link_show(pstart);
preverse = ReverseLink(pstart);
link_reshow(preverse);
return 0;
}
PNODE link_create()
{
PNODE pHead = (PNODE)malloc(sizeof(NODE));//创建一个头指针,并为这个头指针指向的链表头分配一个内存空间
pHead->data = NULL;
pHead->pNext=NULL;
PNODE pMid = pHead;
int num;
printf("请输入要创建的链表的个数: ");
scanf("%d",&num);
for(int i=0;i<num;)
{
int val;
printf("请输入要创建的第%d个数的值: ",++i);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pMid->pNext = pNew;
pNew->pNext = NULL;
pMid = pNew;
}
return pHead;
}
void link_show(PNODE phead)
{
PNODE pShow;
pShow = phead;
while(pShow->pNext != NULL)
{
printf("%d ",pShow->pNext->data);
pShow = pShow->pNext;
}
printf("\n");
}
bool link_insert(PNODE phead,int pos,int val)
{
PNODE p = phead;
int i = 1;
while(p != NULL && i < pos)
{
p = p->pNext;
++i;
}
if(i>pos || NULL == p)
return false;
PNODE pInsert = (PNODE)malloc(sizeof(NODE));
pInsert->data = val;
pInsert->pNext = p->pNext;
p->pNext = pInsert;
return true;
}
bool link_delete(PNODE phead,int pos)
{
PNODE q = phead;
int j = 1;
while(q != NULL && j < pos)
{
q = q->pNext;
++j;
}
if(j>pos || NULL == q)
return false;
PNODE pdelete = (PNODE)malloc(sizeof(NODE));
pdelete = q->pNext;//此时q->pNext与pdelete指向的内存空间是一样的,如果此时free了pdelete,则q就乱指了所以不能free
q->pNext = q->pNext->pNext;
free(pdelete);
return true;
}
PNODE ReverseLink(PNODE pHead)
{
if(pHead == NULL || pHead->pNext == NULL)
{
return pHead;
}
PNODE cur = pHead;
PNODE pre = NULL;
PNODE tmp;
while(cur->pNext)
{
tmp = pre;
pre = cur;
cur = cur->pNext;
pre->pNext = tmp; //操作pre的next逆转
}
cur->pNext = pre; //结束时,操作cur的next逆转
return cur;
}
void link_reshow(PNODE phead)
{
PNODE pShow;
pShow = phead;
while(pShow->pNext != NULL)
{
printf("%d ",pShow->data);
pShow = pShow->pNext;
}
printf("\n");}
PMid = PNew 表示的是PMid指针指向了PNew指针指向的地方,即下一个节点