链表常见面试集合

  • 测试程序 main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define true 1
    #define false 0
    
    typedef int ElementType;
    typedef int bool;
    typedef struct LNode *List;
    typedef struct LNode *PLNode;
    struct LNode {
     ElementType Data;
     PLNode Next;
    };
    
    int main( int argc, char *argv[] )
    {
     List L = NULL;
     AddNode( L, 11 );
     AddNode( L, 12 );
     AddNode( L, 13 );
     if ( L )
     {
     	printf( "addNode success\n" );
     } else {
     	printf( "addNode failed\n" ); 
     }
     TravelList( L );
    
     printf( "the value of node is [%d]", L->Next->Data );
     DeleteNode( L, 10 );
     return 0;
    }
    
  • 从链表的末尾添加节点

    List AddNode( List L, ElementType x )
    {
    	List TempL = L;
    	List node = ( List )malloc( sizeof( struct LNode ) );
    	if ( NULL == node )
    	{
    		printf( "malloc error\n" );
    		return NULL;
    	}
    	node->Data = x;
    	node->Next = NULL;
    
    	// Linkedlist is empty
    	if ( NULL == TempL ) 
    	{
    		TempL = node;
    		return TempL;
    	}
    
    	while ( TempL->Next )
    	{
    		TempL = TempL->Next;
    	}
    	TempL->Next = node;
    	return L;
    }
    
  • 删除链表节点

    void DeleteNode( List L, ElementType x )
    {
    	List tmpNode = NULL; 
    	List delNode = NULL;
    	if ( NULL == L )
    	{
    		printf( "linkedList is empty \n");
    		return ;
    	}
    
    	while ( L && L->Data != x )
    	{
    		tmpNode = L;
    		L = L->Next;
    	}
    
    	if ( NULL == L )
    	{
    		printf("element not exists\n");
    	} else {
    		printf( "delete node is [%d]", L->Data );
    		delNode = L;
    		// delete header
    		if ( NULL == tmpNode )
    		{
    			L = delNode->Next;
    		} else {
    			tmpNode->Next = L->Next;
    		}
    		free( delNode );
    	}
    
    	return ;
    } 
    
  • 链表中倒数第K个节点

    bool IsEmptyList( List L )
    {
    	return L == NULL ? true : false;
    }
    
    void DeleteTailKthNode( List L, int k )
    {
    	int n = 0;
    	List tmpNode = L;
    	PLNode delNode = NULL;
    
    	if ( IsEmptyList( L ) )
    	{
    		printf( "LinkedList is empty" );
    		return ;
    	}
    
    	while ( k > 0 && n < k && NULL != L )
    	{
    		if ( ++n == k )
    		{
    			delNode = L;
    			break;
    		}
    		tmpNode = L;
    		L = L->Next;
    	}
    
    	printf( "deleteNode value is [%d]", delNode->Data );
    	// delete header
    	if ( NULL == tmpNode )
    	{
    		L = delNode->Next;	
    	} else {
    		tmpNode->Next = delNode->Next;
    	}
    	free( delNode );
    	return ;
    }
    
  • 反转链表

    List ReverseList( List L )
    {
        List newList = NULL;
        List curNode = L;
    	List tmpNode = NULL;
    
        while ( curNode != NULL )
        {
           List tmpNode = curNode;
           curNode = curNode->Next;
           tmpNode->Next = newList;
           newList = tmpNode; 
        }
    
        return newList;
    }
    
  • 从尾到头打印链表

    void TravelList( List L )
    {
    	if ( IsEmptyList( L ) )
    	{
    		printf("LinkedList is empty\n");
    		return ;
    	}
    
    	printf("traveling LinkedList value : ");
    	while ( L )
    	{
    		printf("%d ", L->Data);
    		L = L->Next;
    	}
    	printf("\n");
    
    	return ;
    }
    
  • 合并两个排序的链表

  • 两个链表的第一个公共节点

  • 判断两个链表是否有环相关问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值