链表学习持续更新
这边设置链表的节点,里面包含两个信息分别是数据域(可以用自己写的类或者基本数据结构,为了简便这边直接使用基本数据类型)和指向下一节点的指针。
struct SeqList
{
int data;
SeqList *next;
};
1.首先是创建链表
SeqList *creatlist(int n)
{
SeqList* head = new SeqList;
head->data = 100;
SeqList *p = head;
for (int i = 0; i <= n;i++)
{
SeqList *q = new SeqList;
q->data = i;
q->next = NULL;
p->next = q;
p = q;
}
return head;
}
2.修改链表内容
void change_point(SeqList *head, int n, int number)
{
SeqList *p = head;
while (n)
{
p = p->next;
n--;
}
p->data = number;
}
3.删除节点
void delete_point(SeqList *head, int n)
{
SeqList *p = head;
SeqList *tmp = new SeqList;
while (n>1)
{
p = p->next;
n--;
}
tmp = p->next;
p->next = tmp->next;
delete tmp;
}
4.插入节点
void insert_point(SeqList *head, int n, int val)
{
SeqList *listnode = new SeqList;
listnode->data = val;
SeqList*p = head;
while (n>0)
{
p = p->next;
n--;
}
listnode->next = p->next;
p->next = listnode;
}
5.计算链表长度
int listlength(SeqList * head)
{
int count = 0;
SeqList*p = head;
while (p->next!=NULL)
{
p = p->next;
count++;
}
return count;
}
6.打印链表
void print_list(SeqList*head)
{
if (head->next==NULL)
{
return;
}
SeqList *p = head->next;
while (p->next!=NULL)
{
cout << p->data << endl;
p = p->next;
}
}
7.清空&销毁链表
//清空链表
void clearlist(SeqList*head)
{
if (head==NULL)
{
return;
}
SeqList *p = head->next;
while (p != NULL)
{
SeqList *q = p->next;
delete p;
p = NULL;
p = q;
}
head->next = NULL;
}
//销毁链表
void destroylist(SeqList*head)
{
clearlist(head);
delete head;
head = NULL;
}
8.反转链表
SeqList* reverse(SeqList* head){
SeqList* pPrev = nullptr;
SeqList* p = head;
SeqList* pReverseHead = nullptr;
while (p != nullptr){
SeqList* pNext = p->next;
if (pNext == nullptr){
pReverseHead = p;
}
p->next = pPrev;
pPrev = p;
p = pNext;
}
return pReverseHead;
}
9.获取倒数第N个结点
使用快慢指针,先让快指针 q q q走到第N个结点位置,然后让快慢指针一起走,直至快指针的下一个指向NULL
//获得倒数第N个指针(使用快慢指针的方法)
SeqList*getrelistnode(SeqList*head, int n)
{
SeqList *p = head;
SeqList*q = head;
for (int i = 0; i < n;i++)
{
q = q->next;
}
while (q->next!=NULL)
{
p = p->next;
q = q->next;
}
return p;
}
每个函数执行在main()函数中实现
void main()
{
SeqList * head = new SeqList;
head=creatlist(10);//创建链表
listlength(head);//计算链表长度
//change_point(head, 3, 20);//修改元素
// delete_point(head, 2);//删除链表节点
//insert_point(head, 4, 40);//插入链表节点
head=reverse(head);
print_list(head);
clearlist(head);//清空
destroylist(head);//销毁
return;
}