链表

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;
}
原文地址:https://www.cnblogs.com/liuweilinlin/p/3280274.html