首页 > 编程语言 >数据结构和算法——旋转打印链表

数据结构和算法——旋转打印链表

时间:2023-06-14 20:33:31浏览次数:32  
标签:node down right nextRightNode up 链表 算法 数据结构 left


1、问题描述

输入参数n n 为正整数,如输入n=5n=5,则按行打印如下的数字:

数据结构和算法——旋转打印链表_数组

2、问题的理解

这个问题是将数字1…n2 1 … n 2 按照一圈一圈的方式存储好,再按照行的方式对其进行打印。

3、解决的方法

最简单的方法是利用数组:

  • 声明一个二维数组[n][n]
  • 按照一圈一圈的方式向数组中添加对应数字
  • 再按照一行一行的方式打印

这个方法比较简单,就不给出代码了。

4、问题升级

有人觉得上述的问题没什么难度,现在对问题进行升级。

使用链表的方式,不得使用数组。最终按行打印出来。(纯链表的操作)

5、解决的方法

由于本问题并不难,只是有些麻烦,利用这个问题,可以补习C语言中的指针的操作。方法有很多,在这里我给出我自己的方法,不见得是最简单的方法,若有简单的方法大家可以试试,我的方法主要分为以下几步:

  • 对每个节点声明结构体,结构体中的内容包括:数值,指向上、下、左、右四个方向的指针;
  • 函数1:实现一圈的节点关系和数值的设置;
  • 函数2:通过循环调用函数1将所有节点联系起来;
  • 函数3:按行打印。

下面是我的结果截图:

数据结构和算法——旋转打印链表_二维数组_02


n=1

n = 1

数据结构和算法——旋转打印链表_旋转链表_03


n=2

n = 2

数据结构和算法——旋转打印链表_i++_04


n=3

n = 3

数据结构和算法——旋转打印链表_链表_05


n=6

n = 6

数据结构和算法——旋转打印链表_数组_06


n=8

n = 8

以下是我实现的程序代码,仅供参考:

#include<stdio.h>
#include<stdlib.h>

typedef struct node node;

struct node{
    int value;
    node *nextRightNode;
    node *nextLeftNode;
    node *nextUpNode;
    node *nextDownNode;
};


node* setMatrix(int start, int n){

    node* p_left_up = (node*)malloc(sizeof(node));
    p_left_up->value = start;

    if (n < 2){
        p_left_up->nextRightNode = NULL;
        p_left_up->nextLeftNode = NULL;
        p_left_up->nextUpNode = NULL;
        p_left_up->nextDownNode = NULL;
    }else{
        node* p_right_up = (node*)malloc(sizeof(node));
        p_right_up->value = 1 * (n - 1) + p_left_up->value;
        node* p_right_down = (node*)malloc(sizeof(node));
        p_right_down->value = 1 * (n - 1) + p_right_up->value;
        node* p_left_down = (node*)malloc(sizeof(node));
        p_left_down->value = 1 * (n - 1) + p_right_down->value;

        //设置
        p_left_up->nextRightNode = p_right_up;
        p_left_up->nextLeftNode = NULL;
        p_left_up->nextUpNode = NULL;
        p_left_up->nextDownNode = p_left_down;

        p_right_up->nextRightNode = NULL;
        p_right_up->nextLeftNode = p_left_up;
        p_right_up->nextUpNode = NULL;
        p_right_up->nextDownNode = p_right_down;

        p_right_down->nextRightNode = NULL;
        p_right_down->nextLeftNode = p_left_down;
        p_right_down->nextUpNode = p_right_up;
        p_right_down->nextDownNode = NULL;

        p_left_down->nextRightNode = p_right_down;
        p_left_down->nextLeftNode = NULL;
        p_left_down->nextUpNode = p_left_up;
        p_left_down->nextDownNode = NULL;


        //设置中间的值
        //p_left_up=p_right_up
        node* p_1 = p_left_up;
        int i = 0;
        for (i = 0; i < (n-2); i++){
            node* p = (node*)malloc(sizeof(node));
            p->value = p_1->value + 1;

            p->nextRightNode = p_right_up;
            p_1->nextRightNode = p;

            p->nextLeftNode = p_1;
            p_right_up->nextLeftNode = p;

            p_1 = p;
        }

        //p_left_down-->p_left_up
        //p_left_down-->p_right_down
        node* p_2 = p_left_down;
        node* p_3 = p_left_down;
        for (i = 0; i < (n-2); i++){
            //up
            node* p_up = (node*)malloc(sizeof(node));
            p_up->value = p_2->value + 1;

            p_up->nextUpNode = p_left_up;
            p_2->nextUpNode = p_up;

            p_up->nextDownNode = p_2;
            p_left_up->nextDownNode = p_up;

            p_2 = p_up;

            //right
            node* p_right = (node*)malloc(sizeof(node));
            p_right->value = p_3->value - 1;

            p_right->nextRightNode = p_right_down;
            p_3->nextRightNode = p_right;

            p_right->nextLeftNode = p_3;
            p_right_down->nextLeftNode = p_right;

            p_3 = p_right;
        }

        //p_right_up-->p_right_down
        node* p_4 = p_right_up;
        node* r = p_left_up;
        for (i = 0; i < (n-2); i++){
            node* p = (node*)malloc(sizeof(node));
            p->value = p_4->value + 1;

            r = r->nextDownNode;

            p->nextDownNode = p_right_down;
            p_4->nextDownNode = p;

            p->nextUpNode = p_4;
            p_right_down->nextUpNode = p;

            r->nextRightNode = p;
            p->nextLeftNode = r;

            p_4 = p;
        }
    }
    return p_left_up;
}


node* setAll(int start, int n){
    node* p = NULL;
    if (n <= 0){
        printf("please input correct n\n");
    }else{
        p = setMatrix(start, n);
        n = n - 2;
        node* p_tmp = p;

        while (n > 0){
            node* p_down = p_tmp->nextDownNode;
            start = p_down->value + 1;
            node* f = setMatrix(start, n);
            node* p_1 = f;


            //deal
            int i = 0;
            for (i = 0; i < n; i++){
                node* r = p_down;
                node* r_2 = p_1;


                while (r_2->nextRightNode != NULL){
                    r_2 = r_2->nextRightNode;
                }

                r_2->nextRightNode = r->nextRightNode;
                r->nextRightNode->nextLeftNode = r_2;

                r->nextRightNode = p_1;
                p_1->nextLeftNode = r;

                p_down = p_down->nextDownNode;
                p_1 = p_1->nextDownNode;
            }

            n = n - 2;
            p_tmp = f;
        }
    }

    return p;
}

void printMatrix(node* p){
    node* q = p;
    while (q != NULL){
        node* r = q;
        while (r != NULL){
            printf("%d\t",  r->value);
            r = r->nextRightNode;
        }
        printf("\n");
        q = q->nextDownNode;
    }
}

int main(int argc, char** argv){
    if (argc != 2){
        printf("useage : int n\n");
        exit(0);
    }

    int n = atoi(argv[1]);

    //node* p = setMatrix(25, n);
    node* p = setAll(1, n);

    printMatrix(p);

    return 0;
}


标签:node,down,right,nextRightNode,up,链表,算法,数据结构,left
From: https://blog.51cto.com/u_16161414/6480437

相关文章

  • python基础知识——内置数据结构(字典)
      字典是有“键-值”对组成的集合,字典中的“值”通过“键”来引用。“键-值”对之间用逗号隔开,并且被包含在一对花括号中。1、字典的创建格式dictionary_name={key1:value1,key2:value2,...}创建空的字典dictionary_name={}例如dict={'b':'beijing','s':......
  • Pasos和RAFT算法
    Paxos提出时间1990年,RAFT提出时间2013年。RAFT是Paxos的简化版,或者说是提高投票效率,但是降低了投票公平性的妥协方案。RAFT分布式raft(ReplicatedAndFaultTolerant)选举算法原理分成三个角色,领导者,跟随者,和候选者。在没有领导者的时候和领导者联系不上的时候。跟随者......
  • 图像拼接算法技术报告
    图像拼接算法技术报告代码介绍图像拼接是将多个图像按照一定的顺序和几何变换方法组合在一起,形成一个更大、更完整的图像的过程。通过图像拼接,可以将多个部分图像合并为一个整体,以展示更广阔的视野或提供更全面的信息。我们先感性地看一组实验结果(静态场景的图像拼接):左图......
  • go语言编写算法
    1、冒泡排序//冒泡排序a:=[]uint8{9,20,10,23,7,22,88,102}fori:=0;i<len(a);i++{fork:=i+1;k<(len(a)-i);k++{ifa[i]>a[k]{a[i],a[k]=a[k],a[i]}}......
  • 简单易学的机器学习算法——K-Means算法
    一、聚类算法的简介  聚类算法是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。聚类算法与分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习算法。  在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似......
  • 推荐算法——基于矩阵分解的推荐算法
    一、推荐算法概述对于推荐系统(RecommendSystem,RS),从广义上的理解为:为用户(User)推荐相关的商品(Items)。常用的推荐算法主要有:基于内容的推荐(Content-BasedRecommendation)协同过滤的推荐(CollaborativeFilteringRecommendation)基于关联规则的推荐(AssociationRule-Based......
  • 推荐系统中的常用算法——基于Graph Embedding的GES和EGES
    1.概述相比较于基于CollaborativeFilter算法,基于基础GraphEmbedding模型可以根据用户的行为序列学习出item的embedding,利用item对应的Embedding可以方便计算item与item之间的相似度,并在实践中被证明是卓有成效的方法,在基于基础GraphEmbedding模型,主要包括item2vec,node2vec,deepw......
  • 文本分类fastText算法
    1.概述在深度学习遍地开花的今天,浅层的网络结构甚至是传统的机器学习算法被关注得越来越少,但是在实际的工作中,这一类算法依然得到广泛的应用,或者直接作为解决方案,或者作为该问题的baseline,fastText就是这样的一个文本分类工具。fastText是2016年由facebook开源的用于文本分类的工......
  • 机器学习算法实现解析——libFM之libFM的训练过程概述
    本节主要介绍的是libFM源码分析的第四部分——libFM的训练。FM模型的训练是FM模型的核心的部分。4.1、libFM中训练过程的实现在FM模型的训练过程中,libFM源码中共提供了四种训练的方法,分别为:StochasticGradientDescent(SGD),AdaptiveSGD(ASGD),AlternatingLeastSquares(ALS)和MarkovCh......
  • 挑战数据结构和算法面试题——二叉搜索树的后序遍历
    分析:根据二叉查找树的定义,二叉查找树或者是一棵空二叉树,或者是具有一下特性的二叉树:若它的左子树不为空,则左子树上的所有结点的值均小于根节点的值;若它的右子树不为空,则右子树上的所有结点的值均小于根节点的值;它的左右子树又分别是二叉查找树。结合二叉树的后序遍历,则初始序列的最......