已知链表的头结点head,写一个函数把这个链表逆序
2013-10-07 11:14
573 查看
Node * ReverseList(Node *head) //链表逆序 { if ( head == NULL || head->next == NULL ) return head; Node *p1 = head ; Node *p2 = p1->next ; Node *p3 = p2->next ; p1->next = NULL ; while ( p3 != NULL ) { p2->next = p1 ; p1 = p2 ; p2 = p3 ; p3 = p3->next ; } p2->next = p1 ; head = p2 ; return head ; }
上述代买有问题,不能实现整个的逆序;
思路应该为:
若链表为空或只有一个元素,则直接返回;
2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;
3). 重复2),直到q为空
4). 调整链表头和链表尾
#include <stdio.h> #include <stdlib.h> typedef struct tagListNode{ int data; struct tagListNode* next; }ListNode, *List; void PrintList(List head); List ReverseList(List head); int main() { //分配链表头结点 ListNode *head; head = (ListNode*)malloc(sizeof(ListNode)); head->next = NULL; head->data = -1; //将[1,10]加入链表 int i; ListNode *p, *q; p = head; for(int i = 1; i <= 10; i++) { q = (ListNode *)malloc(sizeof(ListNode)); q->data = i; q->next = NULL; p->next = q; p = q; } PrintList(head); /*输出原始链表*/ head = ReverseList(head); /*逆序链表*/ PrintList(head); /*输出逆序后的链表*/ return 0; } List ReverseList(List head) { if(head->next == NULL || head->next->next == NULL) { return head; /*链表为空或只有一个元素则直接返回*/ } ListNode *t = NULL, *p = head->next, *q = head->next->next; while(q != NULL) { t = q->next; q->next = p; p = q; q = t; } /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/ head->next->next = NULL; /*设置链表尾*/ head->next = p; /*调整链表头*/ return head; } void PrintList(List head) { ListNode* p = head->next; while(p != NULL) { printf("%d ", p->data); p = p->next; } printf("/n"); }
相关文章推荐
- 已知链表的头结点head,写一个函数把这个链表逆序
- 已知单向链表的头结点head,写一个函数把这个链表逆序 ( Intel)
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
- 有一个带头结点的单链表L={a1,b1,a2,b2,...,an,bn},设计一个算法将其拆分成两个带头结点的单链表A和B,正序链表A={a1,a2,a3...,an},逆序链表B={bn,bn-1,
- 设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来
- 设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来
- 题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能
- 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中
- 6-6 求单链表结点的阶乘和(15 分) 本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。
- 13\给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点,
- 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点
- 链式A+B有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode* A,ListN
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序
- C/C++ | 26-17 已知一个单向链表的头,删除其某一个结点的算法
- 有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。
- 给定一个循环链表,实现一个算法返回这个环的开始结点
- 日常联系:一个C++程序完成链表的增加结点、删除结点、打印、查询、逆序等操作
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,要求用递归方法进行。