zoukankan      html  css  js  c++  java
  • 挑战面试编程:链表逆转的多种实现

                        挑战面试编程:链表逆转的多种实现

        链表的逆转是一种常见又较复杂的操作,以下使用多种方式进行实现:while、递归以及goto。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    //链表节点
    typedef struct node
    {
    	int data;
    	struct node *next;
    }Node;
    //逆转的while实现
    void rev(Node **list)   //链表逆转
    {
    	if (*list == NULL || (*list)->next == NULL)  //空或者仅仅有一个节点
    	{
    		return;
    	}
    	else
    	{
    		Node *pPre, *pCur, *pNext;
    
    		pPre = *list;
    		pCur = (*list)->next;
    
    		while (pCur)
    		{
    			pNext = pCur->next;
    
    			pCur->next = pPre;
    
    			pPre = pCur;
    
    			pCur = pNext;
    
    		}
    
    		(*list)->next = NULL;
    		*list = pPre;
    	}
    }
    //逆转的递归实现
    void rev_r(Node **list, Node *pCur, Node *pNext)
    {
    	if (pCur == NULL || pNext == NULL)
    	{
    		(*list)->next = NULL;
    
    		*list = pCur;
    
    		return;
    	}
    
    	rev_r(list, pNext, pNext->next);
    
    	pNext->next = pCur;
    }
    //逆转的goto实现
    void rev_goto(Node **list)
    {
    	if (*list == NULL || (*list)->next == NULL)
    		return;
    	else
    	{
    		Node *pPre = *list;
    		Node *pCur = (*list)->next;
    		Node *pNext = NULL;
    
    	stage:
    		pNext = pCur->next;
    
    		pCur->next = pPre;
    
    		pPre = pCur;
    
    		pCur = pNext;
    
    		if (pCur)
    			goto stage;
    
    		(*list)->next = NULL;
    		*list = pPre;
    	}
    }
    void print(Node *list)
    {
    	if (list == NULL)
    		return;
    	printf("%4d", list->data);
    	print(list->next);
    }
    void main() 
    {
    	Node p1 = { 1, NULL };
    	Node p2 = { 2, &p1 };
    	Node p3 = { 3, &p2 };
    	Node p4 = { 4, &p3 };
    	Node p5 = { 5, &p4 };
    	Node p6 = { 6, &p5 };
    	Node *list = &p6;
    	printf("原链表
    ");
    	print(list);
    	printf("
    ");
    	printf("逆转
    ");
    
    	//rev(&list);   //while
    	//rev_r(&list, list, list->next);   //递归
    	rev_goto(&list);   //goto
    	print(list);
    	printf("
    ");
    	system("pause");
    }
    执行



    全部内容的文件夹

  • 相关阅读:
    单链表
    找最长最短字符串
    注解
    Json字符串
    java的反射机制
    java类的加载与加载器
    String StringBuilder StringBuffer
    查看运行某类时当前的进程状态
    迷宫小游戏
    类的初始化过程、super关键字与函数绑定
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6848306.html
Copyright © 2011-2022 走看看