• 链表


    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;
    }
    
  • 相关阅读:
    Docker
    Docker
    VIM
    Python
    Python
    VIM
    Python
    其他
    Java
    Java
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3280274.html
Copyright © 2020-2023  润新知