啥是循环链表:
循环链表是一种链式的存储结构,与单链表不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者头结点,从而构成一个环形的链。
循环链表的运算与单链表的运算基本一致,所不同的有以下几点:
- 在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是像单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。
- 在判断是否到表尾时,是判断该结点指针域的值是否是表头结点,当指针域等于表头指针时,说明已到表尾。而非像单链表那样判断链域值是否为NULL。
思路:
就是跟单链表插入没啥区别,就是注意如果是头尾插入,需要保持最后一个结点指向头结点。
1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 #define NULL 0 5 typedef struct ListNode* CList; 6 struct ListNode { 7 int data; 8 CList next; 9 }; 10 11 //创建空循环链表 12 CList Create() { 13 CList L; 14 L = (CList)malloc(sizeof(ListNode)); 15 L->next = L; 16 return L; 17 } 18 19 //寻找第k个与元素 20 CList FindKth(CList L, int k) { 21 CList p = L; 22 int i = 1; 23 while (p->next != L && i < k) { 24 p = p->next; 25 i++; 26 } 27 if (i == k) 28 return p; 29 else 30 return NULL; 31 } 32 33 //插入 34 void InsertKth(CList L, int k, int item) 35 { 36 CList tmp = (CList)malloc(sizeof(ListNode)); 37 tmp->data = item; 38 //如果在第一个位置插入 39 if (k == 1) { 40 tmp->next = L->next; 41 L->next = tmp; 42 } 43 else { 44 CList node;//当前第k-1个结点 45 node=FindKth(L, k - 1); 46 if (!node) { 47 cout << "结点错误"; 48 return; 49 } 50 tmp->next = node->next; 51 node->next = tmp; 52 } 53 }