注:本文不做详细讲解,注释仅在代码段中,作个人记录使用
详解请看往日博客记录:博客类型为数据结构或算法
目录
目录
一、链表的结构
//链表的结构
typedef struct Node
{
int data;
Node* next;
}Node,*LinkedList;
二、链表的头插法
//链表的头插法
LinkedList creatH()
{
//创建头结点,为头结点分配空间
Node* head = (Node*)malloc(sizeof(Node));
//头结点的next域置空
head->next = NULL;
int value;
while (cin >> value)
{
Node* p = (Node*)malloc(sizeof(Node));
p->data = value;
p->next = head->next;
head->next = p;
}
return head;
}
三、链表的尾插法
//尾插法
LinkedList creatT()
{
//创建头结点,为头结点分配空间
Node* head = (Node*)malloc(sizeof(Node));
//头结点的next域置空
head->next = NULL;
//创建当前指针cur;
Node* cur = head;
int value;
while (cin >> value)
{
Node* p = (Node*)malloc(sizeof(Node));
p->data = value;
p->next = cur->next;
cur->next = p;
cur = p;
}
return head;
}
四、链表的长度
//求长度
int getLength(LinkedList L)
{
int length = 0;
Node* cur = L->next;
while (cur != NULL)
{
length++;
cur = cur->next;
}
return length;
}
五、链表的插入
//插入结点
void insertList(LinkedList L,int loc,int val)
{
if (loc <1 || loc> getLength(L))
{
cout << "插入范围有误!" << endl;
return;
}
//指向头结点
Node* cur = L;
for (int i = 1; i < loc; i++)
{
cur = cur->next;
}
//创建结点
Node* p = (Node*)malloc(sizeof(Node));
p->data = val;
//插入结点
p->next = cur->next;
cur->next = p;
cout << "插入成功!" << endl;
}
六、链表的删除
//删除结点
void deleteList(LinkedList L, int loc)
{
if (loc <1 || loc> getLength(L))
{
cout << "删除范围有误!" << endl;
return;
}
//指向头结点
Node* cur = L;
for (int i = 1; i < loc; i++)
{
cur = cur->next;
}
Node* del = cur->next;
cur->next = del->next;
free(del);
del = NULL;
}
七、单链表反转
//单链表反转
LinkedList reverseList(LinkedList& L)
{
Node* head = L;
//指向当前结点
Node* cur;
//存放后续链表
Node* nex;
//新链表
Node* pre = NULL;
cur = L->next;
free(head);
head = NULL;
while (cur != NULL)
{
nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
}
Node* newHead = (Node*)malloc(sizeof(Node));
newHead->next = pre;
return newHead;
}
八、打印链表
//打印链表
void printList(LinkedList L)
{
Node* cur = L->next;
while (cur)
{
cout << cur->data << " ";
cur = cur->next;
}
cout << endl;
}
九、链表的释放
//链表的释放
void releaseList(LinkedList L)
{
Node* cur = L;
Node* nex = L;
while (cur)
{
nex = nex->next;
free(cur);
cur->next = NULL;
cur = nex;
}
}
十、判断链表是否有环
bool isCycle(LinkedList L)
{
Node* slow = L->next;
Node* fast = L->next;
while (1)
{
fast = fast->next;
if (fast == nullptr)
{
return false;
}
fast = fast->next;
if (fast == nullptr)
{
return false;
}
slow = slow->next;
if (fast == slow)
{
return true;
}
}
}
十一、输出单向链表中倒数第K个结点
Node* Number(LinkedList L)
{
//记录链表的长度
int k;
cin >> k;
//设置快慢指针,起点均为头结点
Node* fast = L;
Node* slow = L;
if (k == 0)
{
slow->data = 0;
return slow;
}
for (int i = 0; i < k; i++)
{
fast = fast->next;
}
while (fast != NULL)
{
fast = fast->next;
slow = slow->next;
}
return slow;
}
十二、求两个链表的公共交点
长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL。
长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。
Node* FindFirstCommonNode(LinkedList L1, LinkedList L2)
{
Node* head1 = L1->next;
Node* head2 = L2->next;
Node* p1 = head1;
Node* p2 = head2;
while (p1 != p2)
{
p1 = (p1 == nullptr ? head2 : p1->next);
p2 = (p2 == nullptr ? head1 : p2->next);
}
return p1;
}