1. 静态链表和动态链表区别详解
1.1 静态链表
使用静态链表存储数据,需要预先申请足够大的一整块内存空间,也就是说,静态链表存储数据元素的个数从其创建的那一刻就已经确定,后期无法更改。
使用静态链表存储数据,你需要通过操控两条链表,一条是存储数据,另一条是记录空闲空间的位置。
1.2 动态链表
使用动态链表存储数据,不需要预先申请内存空间,而是在需要的时候才向内存申请。也就是说,动态链表存储数据元素的个数是不限的,想存多少就存多少。
同时,使用动态链表的整个过程,你也只需操控一条存储数据的链表。当表中添加或删除数据元素时,你只需要通过 malloc 或 free 函数来申请或释放空间即可,实现起来比较简单。
2. 单向链表的反转
link *CTestList::ReverseElem(link *p){
link *pCurr = p;
link *pPrev = NULL;
link* pReversedHead = NULL;
while(pCurr != NULL){
link *pNext = pCurr->next; //保存后驱节点
if(pNext == NULL)
pReversedHead = pCurr;
pCurr->next = pPrev;//将节点的指针指向前驱节点
pPrev = pCurr;//将节点变成前驱节点
pCurr = pNext; //将保存下来的后驱节点变成节点
}
return pReversedHead;
}
3. 判断两个单链表是否相交及找到第一个交点(https://blog.csdn.net/fengxinlinux/article/details/78885764)
node temp=NULL; //存第一个相交节点
while(!stack1.empty()&&!stack2.empty()){ //两栈不为空
temp=stack1.top();
stack1.pop();
stack2.pop();
if(stack1.top()!=stack2.top())
break;
}
return temp->next;
4. 若链表有环,找到环的入口点
struct Link {
int data;
Link *next;
};
// 插入节点
void insertNode(Link *&head, int data) {
Link *node = new Link;
node->data = data;
node->next = head;
head = node;
}
// 判断链表是否存在环
Link* hasCycle(Link* head) {
Link *fast, *slow;
slow = fast = head;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if (fast == slow)
return slow;
}
return NULL;
}
// 确定环的入口点,pos表示fast与slow相遇的位置
Link* findCycleEntry(Link* head, Link* pos) {
while (head != pos) {
head = head->next;
pos = pos->next;
}
return head;
}