题目描述:
题目解读:
要求对链表只能遍历一次,那么自然而然我们会想到奇偶指针。
先写主函数:
int main(){
ListNode *head=createByTail();
head=Solution().oddEvenList(head);
displayLink(head);
return 0;
}
所以我们只需要写出oddEvenList(head)函数就行,来看看怎么写,也就是我们的解题思路是怎么样的.
ListNode *oddEvenList(ListNOde *head){
}
(1)设置两个指针odd(表示奇数位置结点)和even(表示偶数位置结点)
(2)odd从head开始,even从head->next开始,同时为了链接奇偶链表,要保存head->next为evenStart。
ListNode *odd=head;
ListNode *even=head->next;
ListNode *evenStrat=head->next;
(3)然后我们分别考虑奇数链表和偶数链表
如果是奇数链表,odd先跳,则even先跳到链表尾部,也就是说odd!=NULL时表示链表遍历完毕,此时只需要令odd->next=evenStart即可
if(odd){
odd->next=evenStart;
}
如果是偶数链表,odd先跳,则odd先跳到链表尾部,也就是说even!=NULL时表示链表遍历完毕,此时只需要令 前一个odd的next指针指向evenStart即可
if(even){
oddPrev->next=evenStart;
}
(4)先来看在中间正常遍历的情况,也就是odd和even都不为NULL,此时我们声明一个结点prev来记录odd在跳之前的位置,
ListNode *oddPrev=odd;
while(odd && even){
oddPrev=odd;
odd->next=odd->next->next;
odd=odd->next;
if(even->next){
even->next=even->next->next;
even=even->next;
}
}
完整代码:
#include<iostream>
using namespace std;
struct ListNode{
int val;
ListNode *next;
};
//题目解读:
//要求对链表只能遍历一次,那么自然而然我想到了奇偶指针
//(1)设置两个指针odd(表示奇数位置结点)和even(表示偶数位置结点)
//(2)odd从head开始,even从head->next开始,并要存储head->next为evenstart,因为在奇数链表后面要链接这个结点
//(3)然后我们分别考虑偶数链表和奇数链表,
// 如果是奇数链表,odd先跳,则even先跳到链表尾部,也就是说odd!=NULL时表示链表遍历完毕,此时只需要令odd->next=evenStart即可
// 如果是偶数链表,odd先跳,则odd先跳到链表尾部,也就是说even!=NULL时表示链表遍历完毕,此时只需要令 前一个odd的next指针指向evenStart即可
//(4)先来看在中间正常遍历的情况,也就是odd和even都不为NULL
//此时我们声明一个结点prev来记录odd在跳之前的位置,
ListNode *createByTail(){
ListNode *head;
ListNode *p;
ListNode *tail;
int len;
int n=0,num;
cin>>len;
head=NULL;
while(n<len && cin>>num){
p=new ListNode;
p->val=num,
p->next=NULL;
n=n+1;
if(n==1){
head=p;
}
else{
tail->next=p;
}
tail=p;
}
return head;
}
void DisplayList(ListNode *head){
ListNode *p=head;
cout<<"head-->";
while(p){
cout<<p->val<<"-->";
p=p->next;
}
cout<<"tail\n";
}
class Solution{
public:
ListNode *oddEvenList(ListNode *head){
//首先如果head=NULL或者只有一个结点或者只有两个结点就不用管它
if(head==NULL || head->next==NULL || head->next->next==NULL ) {
return head;
}
//然后考虑其他情况
ListNode *odd=head;
ListNode *even=head->next;
ListNode *evenStart=head->next;
ListNode *oddPrev=odd;
while(odd && even){
oddPrev=odd;
odd->next=odd->next->next;
odd=odd->next;
if(even->next){ //防止当链表为偶数时,odd仍不为NULL,但是even跳不了了,
even->next=even->next->next;
even=even->next;
}
}
if(odd){
odd->next=evenStart;
}
if(even){
oddPrev->next=evenStart;
}
return head;
}
};
int main(){
ListNode *head=createByTail();
head=Solution().oddEvenList(head);
DisplayList(head);
return 0;
}