// alithan.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
template <class T>
int getArrayLen(T& array)
{
return (sizeof(array) / sizeof(array[0]));
}
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
/*
观察可知:
update
0 1 NULL
1 2 0
2 3 1
3 NULL 2
*/
class Solution0 {
public:
ListNode* ReverseList(ListNode* pHead) {
if (pHead == NULL) return NULL;//注意程序鲁棒性
ListNode* pNode = pHead;//当前指针
ListNode* pReverseHead = NULL;//新链表的头指针
ListNode* pPrev = NULL;//当前指针的前一个结点
while (pNode != NULL) {//当前结点不为空时才执行
ListNode* pNext = pNode->next;//链断开之前一定要保存断开位置后边的结点
if (pNext == NULL)//当pNext为空时,说明当前结点为尾节点
pReverseHead = pNode;
pNode->next = pPrev;//指针反转
pPrev = pNode;
pNode = pNext;
}
return pReverseHead;
}
};
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode* pre = pHead;
ListNode* pHeadnew = 0;
vector<ListNode*> vec;//vec.pop_back();好吧pop_back()返回值是void型的。
while (pre) {
vec.push_back(pre);
pre = pre->next;
}
pHeadnew = vec[vec.size() - 1];
pre = pHead->next;
int i = 0;
ListNode* prepre;
while (pre) {
prepre = pre->next;
pre->next = vec[i];
pre = prepre;
i++;
}
pHead->next = NULL;
return pHeadnew;
}
};
int main(int argc, char* argv[])
{
ListNode* phead;
ListNode p1(1), p2(2),p3(3);
p1.next = &p2;
p2.next = &p3;
Solution0 s;
phead =s.ReverseList(&p1);
cout << phead->val << endl;
cout << phead->next->val << endl;
cout << phead->next->next->val << endl;
cout << phead->next->next->next << endl;
printf("Hello World!\n");
system("pause");
return 0;
}
链表反转
最新推荐文章于 2024-05-01 11:38:40 发布