链表
1.可以通过记录最后一个节点来判断是否相交
while(pa->next)
{
pa = pa-next;
}
while(pb->next)
{
pb= pb->next;
}
if(pa == pb){...}
2.只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点,无头结点
基本原理,讲当前结点的下个一个结点的数据赋值给当前结点,然后释放下一个结点。
typedef struct node
{
int value;
struct node *next;
} list_node;
void test(list_node* pCur)
{
list_node *pNext = pCur->next;
if (pNext)
{
pCur->next = pNext->next;
pCur->value = pNext->value;
}
delete pNext;
}
3.给定一个结点指针,在结点之前插入一个结点,解法同上
先后插一个结点,然后交换当前结点和后面结点的数据。
4.判断单链表是否有环
typedef struct node
{
int value;
struct node *next;
} list_node;
int is_link_list_cicled(list_node* head)
{
list_node *p = head,
list_node *q = head;
while(p && q)
{
p = p-> next;
q = q-> next;
if(!q)
return 0;
q = q-> next;
if(!q)
return 0;
if(p == q)
return 1;
}
}
5.找到环的入口点
公式x = (n-1)y + y -d;

typedef struct node
{
int value;
struct node *next;
} list_node;
int is_link_list_cicled(list_node* head)
{
list_node *slow = head,
list_node *fast = head;
while(slow && fast)
{
slow = slow-> next;
fast = fast-> next;
if(!fast)
return 0;
fast = fast-> next;
if(!fast)
return 0;
if(slow == fast)
return break;
}
//找到换的入口点
while(slow != fast)
{
slow = slow->next;
fast = fast->next;
}
}
6.找出倒数第k个数
原理:使用两个指针相差k-1,当第一个指针指向最后的时候,第二个指针则指向第K个位置
list_node* findK(list_node* head,int k)
{
list_node* pAhead = head->next;
list_node* pbehind = head->next;
for (int i = 0;i < k ;++i)
{
pAhead = pAhead->next;
}
while(pAhead->next)
{
pAhead = pAhead->next;
pbehind = pbehind->next;
}
return pAhead;
}
7.若结点个数为奇数则返回中间结点
若为偶数则返回中间第一个个结点
while(p->next && p->next->next)
{
q = q->next;
p = p->next->next;
}
return q;
8.带头结点的链表转置
list_node* findK(list_node* head)
{
list_node* pPrev =NULL;
list_node* pCur = head->next;
list_node* pNext = NULL;
while(pCur)
{
pNext = pCur;
pCur->next = pPrev;
pPrev = pCur;
pCur = pNext;
}
head->next = pPrev;
return NULL;
}
9.找出相交链表的交点
list_node* findK(list_node* heada,list_node *headb)
{
list_node *p = heada->next;
list_node *q = headb->next;
int pLen = 0;
int qLen = 0;
int steps = abs(pLen -qLen);
list_node *head = pLen > qLen? p:q;
while(steps)
{
head = head->next;
steps--;
}
pLen>qLen?p = head:q=head;
while(p!=q)
{
p = p->next;
q = q->next;
}
return NULL;
}
一切源于对计算机的热爱

浙公网安备 33010602011771号