链表的转向是常考的内容,方法也很多。
今天在网上看到一个最直观易懂的,摘录下来供大家参考下。
转自: http://blog.csdn.net/feliciafay/article/details/6841115
方法:使用3个指针遍历单链表,逐个链接点进行反转。
步骤:使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。
p = head;
q = head->next;
head->next = NULL;
现在进入循环体,这是第一次循环。
r = q->next;
q->next = p;
p = q;
q =r;
第二次循环。
r = q->next
q->next = p;
p = q;
q = r
第三次循环。。。。。
代码如下:
ActList* ReverseList2(ActList* head) { //ActList* temp=new ActList; if(NULL==head|| NULL==head->next) return head; //少于两个节点没有反转的必要。 ActList* p; ActList* q; ActList* r; p = head; q = head->next; head->next = NULL; //旧的头指针是新的尾指针,next需要指向NULL while(q){ r = q->next; //先保留下一个step要处理的指针 q->next = p; //然后p q交替工作进行反向 p = q; q = r; } head=p; // 最后q必然指向NULL,所以返回了p作为新的头指针 return head; }
相关推荐
接下来,我们转向双向链表,这在“linked”文件中有所涉及。双向链表的每个节点除了包含数据外,还包含两个指针:一个指向前一个节点,另一个指向后一个节点。这样的设计使得双向链表支持双向遍历,可以从前向后或从...
// 链表转向量 workers.reserve(totalWorkers); // 先预估向量大小,提高效率 Worker* current = head; while (current != nullptr) { workers.push_back(*current); current = current->next; } // 向量转链表 ...
接下来,我们转向栈。栈是一种后进先出(LIFO)的数据结构,常用于表达式求值、递归等场景。在C++中,我们可以通过继承`LinkedList`类来实现栈,或者直接使用`Node`类,但这里我们选择第二种方法,因为栈的操作主要...
接下来,我们转向C++。C++在C语言的基础上增加了类和对象的概念,使得链表的实现更加面向对象。我们可以定义一个链表类,其中包含节点对象和相关操作的方法。例如: ```cpp class LinkedList { public: class Node...
/*转向下一个节点*/ } printf("\n"); } ### C语言链表的建立、插入和删除 #### 链表概念与背景 在C语言编程中,链表作为一种动态数据结构,相较于静态数组,提供了更灵活的内存管理方式。链表的每个元素(称为...
接下来,我们转向双向链表。双向链表与单向链表的主要区别在于每个节点不仅有一个指向下一个节点的指针,还有一个指向前一个节点的指针。这种结构提供了更灵活的操作,但也增加了存储需求。 1. **节点结构**:双向...
接下来,我们转向“链表”的讨论。链表是一种线性数据结构,它的元素(节点)不存储在连续的内存位置。每个节点包含数据以及指向下一个节点的指针。相比于数组,链表的主要优势在于动态添加或删除元素时的高效性。...
接下来,我们转向链表的递归显示。链表是一种动态数据结构,由节点组成,每个节点包含数据和指向下一个节点的引用。在递归实现中,我们可以定义一个函数,接收链表的头节点作为参数。函数首先检查头节点是否为空,...
接下来,我们转向双向链表这一数据结构。双向链表是一种线性数据结构,每个节点包含数据部分和两个指针,分别指向前一个节点和后一个节点。这种结构相比单链表,提供了更灵活的访问和操作能力,因为可以从任一方向...
然后,我们转向集合的运算。集合的交并运算是集合论的基本概念,主要包括求两个集合的交集(intersection)和并集(union)。在C++中,可以借助STL(Standard Template Library)中的`std::set`来实现这些运算,但是...
接着,我们转向链表实现的“C语言学生成绩管理系统(链表).txt”。链表不同于数组,它的元素在内存中不一定是连续存储的,而是通过指针链接。链表的优点在于动态扩展性,可以在运行时增加或减少节点,更适合处理数量...
接着,我们转向`List.java`,这是一个接口文件,它定义了操作链表的一系列方法。根据描述,这个接口应该实现了`List`接口,这意味着它将提供以下常见的操作: 1. **添加元素**:`add(E element)` 方法用于在链表的...
接下来,我们转向链表,特别是双向循环链表。链表是一种动态数据结构,它的元素(节点)不是连续存储的,而是通过指针链接。"双向链表修改.txt"和"双向循环链表.txt"可能是关于如何创建、插入、删除节点以及遍历链表...
接着,我们转向单链表。单链表由一系列节点组成,每个节点包含数据和指向下一个节点的引用。在Java中,我们可以创建一个Node类来表示链表节点,包含数据字段和指向下一个节点的next字段。链表的头部是一个特殊的节点...
接下来,我们转向链表。链表也是线性数据结构,但它的元素在内存中不一定是连续的。每个元素(节点)包含数据和指向下一个节点的指针。对于学生信息,我们可以定义一个类似的`Student`结构体,但是需要额外添加一个...
现在,我们转向链表堆栈的实现。堆栈是“后进先出”(LIFO)的数据结构,而链表的特性正好可以很好地支持这种操作。我们可以用链表的头部作为堆栈的顶部,每次压入新元素时,将其添加到头部;弹出元素时,从头部移除...
了解了动态内存分配后,我们可以转向单链表的建立。链表是一种非顺序存储结构,它的每个节点包含两部分:数据域和指针域,指针域指向下一个节点。在C语言中,通常定义一个结构体来表示链表节点: ```c typedef ...
接下来,我们转向链表实现。链表是非线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的引用。在约瑟夫环问题中,每个节点代表一个人,节点的下一个引用可以模拟圈子的连接。报数过程通过遍历链表...
接下来,我们转向链表。链表也是一种线性数据结构,但它不强求元素在内存中的连续存储。每个元素(节点)包含数据和指向下一个节点的指针,形成了一个链式结构。链表的插入和删除操作相对快速,因为只需要改变相邻...
现在,我们转向面向对象编程的部分。`纯虚接口`在C++中是抽象类的一种形式,它至少包含一个纯虚函数。在链表操作中,我们可以创建一个抽象基类,定义基本操作如添加、删除等,并让具体的链表类型(如单链表、双向...