倒序打印链表:
1.遍历
2.申请数组/栈
3.递归
#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
int nValue;
struct list *pNext;
}List;
List *CreateList()
{
int nCount; //节点个数
int nNum;//节点的值
List *pHead = NULL;
List *pTail = NULL;
List *pTemp = NULL;
printf("请输入节点个数:\n");
scanf("%d",&nCount);
while(nCount != 0)
{
printf("输入数值:\n");
scanf("%d",&nNum);
pTemp = (List*)malloc(sizeof(List));
pTemp->nValue = nNum;
pTemp->pNext = NULL;
//尾添加
if(pHead == NULL)
{
pHead = pTemp;
}
else
{
pTail->pNext = pTemp;
}
pTail = pTemp;
nCount--;
}
return pHead;
}
void Print(List *pHead)
{
if(pHead == NULL)return;
while(pHead)
{
printf("%d ",pHead->nValue);
pHead = pHead->pNext;
}
printf("\n");
}
void RePrint(List *pHead)
{
if(pHead == NULL)return;
//处理下一个
RePrint(pHead->pNext);
//打印
printf("%d ",pHead->nValue);
}
int main()
{
List *pHead = CreateList();
Print(pHead);
RePrint(pHead);
printf("\n");
return 0;
}
链表结构打断倒叙:
1.把头指针摘除,不断尾插
2.递归(将倒叙输出中输出的部分改成指向前一个指针)
3.定义一个数组和一个新链表(数组存储的是地址)
4.入栈(存储的是地址)
5.改变指针指向(三个指针)
#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
int nValue;
struct list *pNext;
}List;
List *CreateList()
{
int nCount; //节点个数
int nNum;//节点的值
List *pHead = NULL;
List *pTail = NULL;
List *pTemp = NULL;
printf("请输入节点个数:\n");
scanf("%d",&nCount);
while(nCount != 0)
{
printf("输入数值:\n");
scanf("%d",&nNum);
pTemp = (List*)malloc(sizeof(List));
pTemp->nValue = nNum;
pTemp->pNext = NULL;
//尾添加
if(pHead == NULL)
{
pHead = pTemp;
}
else
{
pTail->pNext = pTemp;
}
pTail = pTemp;
nCount--;
}
return pHead;
}
void Print(List *pHead)
{
if(pHead == NULL)return;
while(pHead)
{
printf("%d ",pHead->nValue);
pHead = pHead->pNext;
}
printf("\n");
}
List *Reverse(List *pHead)
{
if(pHead == NULL || pHead->pNext == NULL)return pHead;
List *p1 = NULL;
List *p2 = pHead;
List *p3 = pHead->pNext;
while(p3 != NULL)
{
p2->pNext = p1;
p1 = p2;
p2 = p3;
p3 = p3->pNext;
}
p2->pNext = p1;
return p2;
}
int main()
{
List *pHead = CreateList();
Print(pHead);
RePrint(pHead);
printf("\n");
pHead = Reverse(pHead);
Print(pHead);
return 0;
}
如何判断两个单向链表相交?如果相交,找交点。
1.利用两个栈,如果相交,依次出栈元素值相同。最后一个相同元素即是交点。
2.两个链表遍历到尾,看是否相同。
3.一个链表走一步,另一个链表走一遍。可以同时解决两个问
题。
4.将a链表遍历到尾,尾连接b链表的头,遍历b链表,要是b链表可以遍历到a链表的尾,则说明相交
5.比较a与b链表的长度,b先走b-a的长度,然后两个一起走,要是相遇了,则说明相交,有交点。
判断一个普通单向链表是否有环?如果有环,找到环的入口节点。
1.用一个新链表b来存储,遍历链表a,如果元素在链表b中没有出现,则添加到链表里,如果出现了,则说明是个有环链表。
2.两个孩子,一个跑的快,一个跑的慢,如果链表有环,则一定会再次相遇。
3.变成Y型链表
折叠链表
1-》2-》3-》4-》5-》6-》7-》8
1-》8-》2-》7-》3-》6-》4-》5
**1.**1-》2-》3-》4,8-》7-》6-》5,倒置其中一个链表,合并两个链表。
参考::https://blog.youkuaiyun.com/fengxinlinux/article/details/78885764