反转链表17
2016-05-30 20:27
274 查看
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表节点的定义如下:
解题思路:需要三个指针,当前遍历的节点,它的前一个节点以及它的后一个节点,防止链表断开。
测试用例:
反转链表函数实现:
struct ListNode{ int m_value; //节点存储的值 ListNode *m_next; //节点指针 void show(); //打印所有节点值 };
解题思路:需要三个指针,当前遍历的节点,它的前一个节点以及它的后一个节点,防止链表断开。
测试用例:
int main(){ //创建一个多结点链表 ListNode *L2 = new ListNode; L2 = NULL; addToTail(&L2, 1); addToTail(&L2, 2); //末尾加入2 addToTail(&L2, 3); //末尾加入3 addToTail(&L2, 4); //末尾加入4 addToTail(&L2, 5); //末尾加入5 addToTail(&L2, 6); //末尾加入6 //显示L2 std::cout << "L2: "; L2->show(); //Output:1,2,3,4,5,6 std::cout << std::endl; //反转链表,多个节点 std::cout << ReverseList(L2)->m_value << std::endl; //OutPut: 6 //单个节点 ListNode *L1 = new ListNode; L1 = NULL; addToTail(&L1, 9); std::cout << ReverseList(L1)->m_value; return 0; }
反转链表函数实现:
//本题函数实现 ListNode* ReverseList(ListNode *pHead){ if(!pHead){ std::cout << "List is NULL\n"; return NULL; } //待返回的头节点 ListNode *reversedHead = new ListNode; reversedHead = NULL; //当前遍历到的节点 ListNode *pNode = pHead; //当前遍历节点的前一节点 ListNode *pPrev = new ListNode; pPrev = NULL; while(pNode != NULL){ //当前遍历节点的后一个节点 ListNode* pNext = pNode->m_next; if(pNext == NULL) reversedHead = pNode; //当前结点的下一节点指向当前结点的前一节点 pNode->m_next = pPrev; //这是反转的过程 //前一节点指向遍历的当前结点 pPrev = pNode; //当前遍历的节点指向下一节点 pNode = pNext; } return reversedHead; } //以下为其他函数实现 void ListNode::show(){ ListNode *temp = this; if(temp == NULL) std::cout << "\nlist is NULL\n"; while(temp != NULL){ std::cout << temp->m_value << " "; temp = temp->m_next; } } //在一个链表的末尾添加一个节点 void addToTail(ListNode **head, int value){//由于会改动链表指针,所以必须把head参数设为指向指针的指针。否则出了这个函数作用域,改动便无效。 //1.首先创建要插入的节点 ListNode *pNew = new ListNode; pNew->m_value = value; //指定值 pNew->m_next = NULL; //!!!切记指定下一节点为NULL //2.如果传入的节点为空,可直接创键头节点 if(*head == NULL) *head = pNew; else{//否则3. //定义一个临时节点 ListNode *temp = *head; while(temp->m_next != NULL) //循环指向末尾节点, !!!切记必须指向下一节点 temp = temp->m_next; //对末尾的下一个节点赋值,取代之(末尾) temp->m_next = pNew; } }
相关文章推荐
- 2016SDAU课程练习三1013
- 搜集整理java中GC的理解
- java 基于jxl解析xls以及解决丢失精度问题
- mysql 锁表解锁
- 十四周项目-项目3-数组类模板
- 持续集成(上)
- linux学习笔记2 - linux常用命令
- 设计模式学习笔记--迭代器模式
- 查看文件大小命令
- 自动化测试之uiautomator
- 求string字符串长度
- 模拟登录学校教务网 获取课程表信息
- Redis 复制
- 如何将excel表格数据使用图形化工具workbench导入mysql数据库中
- 费马数学习总结
- Android简单自定义圆形和水平ProgressBar
- springmvc中@PathVariable和@RequestParam的区别
- IOS new Date() 时间转换失败问题以及其他问题
- UIView 中常见的方法总结
- Android系统无法进入休眠