數據結構-雙向鏈表、雙向循環鏈表

圖片描述

定義節點node

typedef struct Node {
                int data;
                struct Node *head;
                struct Node *next;
            } DoubleLinkNode;

建立雙向鏈表ui

//建立節點
            DoubleLinkNode *rootNode = alloca(sizeof(DoubleLinkNode));
            rootNode->data = 10;
            rootNode->head = NULL;
            rootNode->next = NULL;
            
            DoubleLinkNode *node1 = alloca(sizeof(DoubleLinkNode));
            node1->data = 20;
            node1->head = NULL;
            node1->next = NULL;
            
            DoubleLinkNode *node2 = alloca(sizeof(DoubleLinkNode));
            node2->data = 30;
            node2->head = NULL;
            node2->next = NULL;
            
            DoubleLinkNode *node3 = alloca(sizeof(DoubleLinkNode));
            node3->data = 40;
            node3->head = NULL;
            node3->next = NULL;
            
            //鏈接節點
            rootNode->next = node1;
            
            node1->head = rootNode;
            node1->next = node2;
            
            node2->head = node1;
            node2->next = node3;
            
            node3->head = node2;
            
            // 反轉
            DoubleLinkNode *node = reverseDoublelink(rootNode);

反轉雙向鏈表spa

DoubleLinkNode* reverseDoublelink (DoubleLinkNode *node) {
                if (node == NULL) {return NULL;}
                DoubleLinkNode *pre = NULL;
                while (node) {
                    // 記錄下一個節點
                    DoubleLinkNode *nextTemp = node->next;
                    // 反轉
                    node->head = nextTemp;
                    node->next = pre;
                    // 把前節點置爲當前節點
                    pre = node;
                    // 把當前節點置爲下個節點
                    node = nextTemp;
                }
                return pre;
            }

雙向循環鏈表節點code

typedef struct Node {
                int data;
                struct Node *head;
                struct Node *next;
            } DoubleCirculationLinkNode;

雙向循環鏈表建立圖片

//建立節點
            DoubleCirculationLinkNode *rootNode = alloca(sizeof(DoubleCirculationLinkNode));
            rootNode->data = 10;
            rootNode->head = NULL;
            rootNode->next = NULL;
            
            DoubleCirculationLinkNode *node1 = alloca(sizeof(DoubleCirculationLinkNode));
            node1->data = 20;
            node1->head = NULL;
            node1->next = NULL;
            
            DoubleCirculationLinkNode *node2 = alloca(sizeof(DoubleCirculationLinkNode));
            node2->data = 30;
            node2->head = NULL;
            node2->next = NULL;
            
            DoubleCirculationLinkNode *node3 = alloca(sizeof(DoubleCirculationLinkNode));
            node3->data = 40;
            node3->head = NULL;
            node3->next = NULL;
            
            //鏈接節點
            rootNode->head = node3;
            rootNode->next = node1;
            
            node1->head = rootNode;
            node1->next = node2;
            
            node2->head = node1;
            node2->next = node3;
            
            node3->head = node2;
            node3->next = rootNode;