链表的创建
head为头节点,pend为尾节点,pnew为当前插入的节点
#include<bits/stdc++.h>
using namespace std;
struct node
{
int num;
struct node *next;
};
int main()
{
node *head,*pend,*pnew;
// 不带头节点的单链表
// int n=10;
// while(n--)
// {
// pnew = (struct node*)malloc(sizeof(node));//为新节点申请空间
// pnew->num=n;//赋值
// pnew->next=NULL;//该节点的下一个节点为空
// if(head == NULL)//如果头部为空,代表这是第一次创建节点,设置这个节点为头节点
// {
// head=pnew;
// pend=head;
// }
// else{//改节点不是头节点
// pend->next=pnew;//让上一个节点的next等于这个节点(连接起来)
// pend=pnew;//让这个节点变为最后一个节点
// }
// }
// 带头节点的单链表
head=(struct node*)malloc(sizeof(node));
head->next=NULL;//头节点不存值,直接指向下一个节点
pend=head;
int n=10;
while(n--)
{
pnew =(struct node*)malloc(sizeof(node));
pnew->num=n;//赋值
pnew->next=NULL;
pend->next=pnew;//连接起来
pend=pnew;//更新尾节点
}
return 0;
}
以下都是以带头节点的单链表为例子(head头节点没有num值)
逆序输出单链表
void reversePrint(node *head)//逆序输出单链表
{
if(head==NULL) return ;
reversePrint(head->next);
printf("%d\n" ,head->num);
}
链表的反转
1.非递归
p为原链表,newH为新链表
node* reverseList(node *H)
{
if(H==NULL||H->next==NULL) return H;
node *p=H,*newH;
while(p)
{
node *temp =p->next;//先储存下一个节点
p->next=newH;//让下一个节点变为newH,与newH连接
newH=p;//newH拥有p节点的值
p=temp;//让p进入下一个节点
}
return newH;
}
2.递归
node* In_reverseList(node *H)
{
if(H==NULL||H->next==NULL) return H;
node *newHead=In_reverseList(H->next);
H->next->next=H;//H->next相当于newHead
//newHead的下一个就是这个节点
H->next=NULL;//让这个节点的下一个为空,防止链表错乱
return newHead;
}
寻找倒数第k个数
node * findK(node *head,int k)
{//俩个指针,一个先走k步,第二个指针再开始走,当第一个到终点时,第二个的位置就是倒数第k个数
node *p=head;
for(int i=0;i<k;i++)
{
p=p->next;
}
node *q=head;
while(p)
{
p=p->next;
q=q->next;
}
return q;
}
删除倒数第k个数
void erase(node *head,int k)//删除倒数第k个数
{
node *p=findK(head,k+1);//先查找到倒数k+1个数,即k的前一个数
p->next=p->next->next;
}
选择排序(升序)
void sortList(node * head)
{
node *p=head;
while(p)
{
node *q=p->next;
while(q)
{
if(p->num>q->num)
{
int t=p->num;
p->num=q->num;
q->num=t;
}
q=q->next;
}
p=p->next;
}
}