反转链表17
来源:互联网 发布:微商城开发费用 知乎 编辑:程序博客网 时间:2024/06/03 10:58
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表节点的定义如下:
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; }}
0 0
- 反转链表17
- 剑指offer(17):反转链表
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- 链表反转
- Easy-题目35:9. Palindrome Number
- Hibernate XX is not Mapped问题笔记
- .m 文件与.mm文件的区别
- Easy-题目36:112. Path Sum
- Android学习记录(十九)-简单的动画清除
- 反转链表17
- Easy-题目37:111. Minimum Depth of Binary Tree
- poj 2286
- 类与类之间的关系
- 常用docker镜像安装
- MyEclipse10配置自动补全/字体大小/行号/背景颜色
- Easy-题目38:160. Intersection of Two Linked Lists
- 偏好设置
- 总结