循环链表(3) - 遍历

在循环链表系列的前2篇文章中,已经介绍了循环链表的基本情况以及插入操作。本篇讨论如何对它进行遍历操作。

通常对普通链表进行遍历时,一般从头节点开始,并遇到null节点时停止。而在循环链表中,当第二次到达首节点时,遍历停止。

下面是循环链表遍历代码实现:

#include <iostream>

//链表节点
struct Node
{
	int data;
	Node *next;
};

//在循环链表头部插入新的节点
void push(Node **head, int data)
{
	Node *newNode = new Node;
	Node *temp = *head;
	newNode->data = data;
	newNode->next = *head;

	//如果链表不为空,则将最后一个节点的后向指针设置为新节点
	//即新节点变成了新的头节点。
	if (*head != NULL)
	{
		while (temp->next != *head)
			temp = temp->next;
		temp->next = newNode;
	}
	else
		newNode->next = newNode; //新节点做为链表第一个节点

	*head = newNode;  //调整头节点
}

//打印循环链表
void printList(Node *head)
{
	Node *temp = head;
	if (head != NULL)
	{
		do
		{
			std::cout << " " << temp->data << " ";
			temp = temp->next;
		} while (temp != head);
	}
}

int main()
{
	//初始化链表为:[11]->2->56->12->[11],其中[11]表示同一个节点
	Node *head = NULL;
	push(&head, 12);
	push(&head, 56);
	push(&head, 2);
	push(&head, 11);

	std::cout<<"Circular Linked List: \n ";
	printList(head);

	return 0;
}

输出:

Circular Linked List is:

11 2 56 12

时间: 2024-10-24 01:43:54

循环链表(3) - 遍历的相关文章

编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++)

圆圈中最后剩下的数字(循环链表) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0开始每次从这个圆圈里删除第m个数字. 求出这个圆圈里最后剩下的数字. 使用循环链表, 依次遍历删除, 时间复杂度O(mn), 空间复杂度O(n). 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostr

java源码解析---LinkedHashMap

1 package explain; 2 3 import java.util.function.Consumer; 4 import java.util.AbstractCollection; 5 import java.util.AbstractSet; 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.Map; 9 import java.util.Set; 10 import java.

线索二叉树C+Java

1.线索二叉树的原理: 为什么会有线索二叉树呢?我们观察一个普通的二叉树: 这正是我们平常见到的二叉树,可以发现A,B,C,D这四个节点它们的左孩子和有孩子都有节点,而E,F,G,H,I,J它们都有空闲的指针,这些空闲的指针不存储任何事物 白白浪费了内存的资源. 当我们中序遍历二叉树:HDIBJEAFCG .遍历完之后可以指到每个节点的前驱和后继,如D的前驱是H,后继是I. 可是这是建立在已经遍历完之后的基础上,这里需要注意的是每一种遍历的结果前驱和后继都会不一样的. 在二叉链表创建完后,我们只

用只含一个链域的节点实现循环链表的双向遍历

通常来说,要实现循环双向链表,每个节点需要有两个链域:前驱和后继.现在的问题是:如何设计一种环形表,使表的每个结点只包含一个链域而又能够有效地对其进行两个方向的查找.本文将给出一种实现方式. 首先,在给出之前,需要先了解一种有趣的运算,那就是异或运算.异或运算的真值表如下: A B A^B 0 0 0 0 1 1 1 0 1 1 1 0 通过异或的性质可以知道,对于任意一个二进制数a,有a^a = 0.利用这一性质,考虑下面一个经典例子:实现两个整数的交换 void swap(int *x, i

2019.9.17-单向循环链表:遍历+求长度+添加元素(完整代码)

# coding:utf-8 class Node(object): """節點0""" def __init__(self, elem): self.elem = elem self.next = None # node = None(100)class SingleLinkList(object): """單向循環鏈表""" def __init__(self, node=None)

第33课 双向循环链表的实现

1. DTLib中双向链表的设计思路 (1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现. (2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分. 2. 实现思路 (1)通过模板定义DualCircleList类,继承自DualLinkList类 (2)在DualCircleList内部使用Linux内核链表进行实现(另类实现) (3)使用struct list_head定义DualCircleList的头结点 (4)特殊处理:循环遍历时忽略头结点

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

小猪的数据结构辅助教程——2.7 线性表中的双向循环链表

小猪的数据结构辅助教程--2.7 线性表中的双向循环链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.了解引入双向循环链表的原因 2.熟悉双向循环链表的特点以及存储结构 3.掌握双向循环链表的一些基本操作的实现逻辑 4.掌握逆序输出双向循环链表元素逻辑 1.双向循环链表的引入 2.双向循环链表的存储结构 双向循环链表的特点: 上面也说了,空间换时间,比起循环链表只是多了一个指向前驱的指针 特点的话: 判断空表:L ->next = L -> prior = L; 存