leetcode笔记—翻转链表
2016-05-05 09:17
369 查看
1、翻转链表
ListNode* revertList(ListNode* head){ //翻转链表
if(head == NULL){
return NULL;
}
ListNode* p = head->next;
head->next = NULL;
while(p != NULL){
ListNode* tmp = p;
p = p->next;
tmp->next = head;
head = tmp;
}
return head;
}
2、链表相邻的k个节点翻转
//以上程序是有问题的,不知道哪里错了,下面是个accepted
void reverseNodes(ListNode *start, ListNode *end) { //翻转链表 ListNode *second = start -> next; ListNode *first = start; ListNode *temp; while(second != end) { temp = second -> next; second -> next = first; first = second; second = temp; } second -> next = first; } //翻转后start指向最后一个节点
ListNode* revertList(ListNode* head){ //翻转链表
if(head == NULL){
return NULL;
}
ListNode* p = head->next;
head->next = NULL;
while(p != NULL){
ListNode* tmp = p;
p = p->next;
tmp->next = head;
head = tmp;
}
return head;
}
2、链表相邻的k个节点翻转
void reverseNodes(ListNode *start, ListNode *end) { ListNode *second = start -> next; ListNode *first = start; ListNode *temp; while(second != end) { temp = second -> next; second -> next = first; first = second; second = temp; } second -> next = first; } ListNode *reverseKGroup(ListNode *head, int k) { ListNode *tempHead = head, *tempEnd = head; ListNode *result = head; ListNode *preEnd = head; ListNode *temp = NULL; bool flag = true; int count = 1; if(!head) { return NULL; } while(tempEnd -> next) { tempEnd = tempEnd -> next; count++; if(count == k) { temp = tempEnd -> next; if(flag) { flag = false; result = tempEnd; reverseNodes(tempHead, tempEnd); tempHead -> next = temp; count = 1; } //翻转第一个k个节点; else { preEnd -> next = tempEnd; preEnd = tempHead; reverseNodes(tempHead, tempEnd); tempHead -> next = temp; count = 1; }//翻转后面的节点 if(temp) { tempHead = temp; tempEnd = temp; } else { tempHead -> next = NULL; return result; } } } return result; } };
//以上程序是有问题的,不知道哪里错了,下面是个accepted
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode** re=&head; ListNode* pre=head; ListNode* q=NULL; whi 4000 le(true) { int i=k; ListNode* temp=pre; while(temp!=NULL&&--i>0) { temp=temp->next; } //取到K个节点的尾 if(temp==NULL) return head;//如果没有K长度,返回 i=k; while(i--) { //翻转 ListNode *p_next=pre->next; pre->next=q; q=pre; pre=p_next; } (*re)->next=pre; ListNode *t=*re; *re=q; re=&(t->next); q=NULL; } return head; } };
相关文章推荐
- jquery移动端日期插件
- 终极dos批处理循环命令详解
- 技术培训 | 大数据分析处理与用户画像实践|预告
- Oracle存储过程基本语法介绍
- joomla实现注册用户添加新字段的方法
- java web错误之404
- CRM开发要点(二)
- Asp.net mvc 实时生成缩率图到硬盘
- 存储过程详解
- PhoneGap/Cordova微信分享插件【升级版】
- python 中 del 的用法
- IDEA导出jar包
- C#中正则表达式的3种匹配模式
- TF-IDF及其算法
- [剑指offer]第一个只出现一次的字符位置
- MySql trigger 触发器
- Linux-06-Linux系统发展史及GNU-GPL-自由软件介绍2(L002-20)
- C#双串口采集光照度与温度和湿度 数据保存在mysql 参数自动保存 解析格式十六进制收发
- c# 日期时间格式24小时制
- PHP5.3x不再支持ereg和eregi