14--反转链表
2015-09-27 19:05
435 查看
// // main.cpp // test_list_oper // // Created by Hugo Cao on 15/7/6. // Copyright (c) 2015年 Hugo Cao . All rights reserved. // /* 题目:反转链表 伴随着大量的指针操作,3个指针,复杂度O(n). //反转链表,三个指针,遍历一次。 lNode * secondReseverList(lNode *head) { //如果链表长度为0或者1,那么不需要翻转 if (head == NULL || head->m_pNext == NULL) { cout << "无需翻转" << endl; return head; } lNode *p_head = NULL; //返回的头节点 lNode *p_Node = head; //当前结点 lNode *p_Prev = NULL; //前一个节点 while (p_Node != NULL) { //下一个节点,这是很关键的一步 lNode *p_Next = p_Node->m_pNext; if (p_Next == NULL) { p_head = p_Node; } p_Node->m_pNext = p_Prev; p_Prev = p_Node; p_Node = p_Next; } return p_head; } */ #include <stdio.h> #include <stdlib.h> #include <stack> #include <iostream> using namespace std; typedef struct ListNode { int m_nValue; struct ListNode *m_pNext; } lNode; //添加元素结点 void listAddNode(lNode *head) { lNode *p = head, *p_Inter = NULL; if (!(p_Inter = ((lNode *)malloc(sizeof(lNode))))) { printf("the memery is don't create it\n"); return; } p_Inter->m_pNext = NULL; int data; printf("请输入数字:\n"); scanf("%d", &data); p_Inter->m_nValue = data; while (p->m_pNext != NULL) { p = p->m_pNext; } p->m_pNext = p_Inter; } //创建元素结点 lNode* createList(lNode *head) { if (!(head = ((lNode *)malloc(sizeof(lNode))))) { printf("the memery is don't create it\n"); return NULL; } head->m_pNext = NULL; int data; printf("请输入数字:\n"); scanf("%d", &data); head->m_nValue = data; lNode *p = head; char X_cin = 'Y'; while (true) { printf("是否继续添加:N/n \n"); cin >> X_cin; if (X_cin == 'y' || X_cin == 'Y') { ; } else if (X_cin == 'N' || X_cin == 'n') { return head; } else { ; } listAddNode(p); } } //显示列表 void showList(lNode *head) { if (NULL == head) { cout << "list is empty \n" << endl; return; } lNode *p = head; while (p != NULL) { printf("%d\n", p->m_nValue); p = p->m_pNext; } } //翻转链表 void reversePut(lNode *point) { stack <int> stack_rev; lNode *p = point; while (p != NULL) { stack_rev.push(p->m_nValue); p = p->m_pNext; } cout << "翻转以后的输出" << endl; while (!stack_rev.empty()) { cout << stack_rev.top() << endl; stack_rev.pop(); } } //输出倒数第K个元素节点,遍历所有节点型。 void firstPrintNode(lNode *head, int kNum) { int length = 0; lNode *p = head; while (p != NULL) { p = p->m_pNext; length++; } if (length < kNum) { cout << "链表长度为:" << length << ", 而遍历的节点位置是: "<< kNum << endl; return; } cout << "链表长度为:" << length; p = head; while (length != kNum) { length--; p = p->m_pNext; } cout << " 输出倒数第K个元素节点: " << p->m_nValue << endl; } //输出第K个结点,第二种方式,两个指针 void secondPrintNode(lNode *head, int kNum) { lNode *p1 = head; lNode *p2 = head; int length = kNum; while (p1 != NULL) { p1 = p1->m_pNext; length--; if (length < 0) p2 = p2->m_pNext; } cout << " 输出倒数第K个元素节点: " << p2->m_nValue << endl; } //反转链表,三个指针,遍历一次。 lNode * secondReseverList(lNode *head) { //如果链表长度为0或者1,那么不需要翻转 if (head == NULL || head->m_pNext == NULL) { cout << "无需翻转" << endl; return head; } lNode *p_head = NULL; //返回的头节点 lNode *p_Node = head; //当前结点 lNode *p_Prev = NULL; //前一个节点 while (p_Node != NULL) { lNode *p_Next = p_Node->m_pNext; //下一个节点 if (p_Next == NULL) { p_head = p_Node; } p_Node->m_pNext = p_Prev; p_Prev = p_Node; p_Node = p_Next; } return p_head; } int main() { lNode *head = NULL; head = createList(head); //showList(head); //翻转链表,用栈实现, //reversePut(head); //输出倒数第K个元素 //secondPrintNode(head, 3); //secondReseverList(head); head = secondReseverList(head); showList(head); return 0; }
相关文章推荐
- A child container failed during start
- HTTPD 工作原理
- 图解Linux命令之--lsattr命令
- 13--输出链表中倒数第k个节点,
- 13--输入一个整数数组,实现一个函数来调整数组中数字的顺序
- poj 2152 树形dp(建立消防站)
- jquery Ajax
- 12--打印1到最大的N为数字。
- 利用VS生成静态库
- 软件生存周期
- 酷狗音乐推出了自媒体APP百花
- C++字符串操作函数
- 用Wget下载整个网站
- 11--数值的整数次方
- 10--输入一个十进制的整数,转化为二进制,输出有多少个1
- 各种排序算法
- Web.xml配置详解之context-param
- 9--斐波那契数列
- 8--数组旋转
- ThinkPHP--模板与框架整合