题目描述
输入一个链表,反转链表后,输出新链表的表头。
解法
三个连续的指针,顺着链表依次反转即可。
每次操作都保证:
- pre指向新链表的头结点
- phead指向原链表的头结点
- nexthead指向原链表的第二个结点
- 然后将原链表的头结点连接新链表的头结点即可,pHead->next = pre;如此循环操作
- 时间复杂度O(N),N是链表长度
- 时间复杂度O(1)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
//链表为空 或者 只有一个结点
if( pHead == NULL || pHead->next == NULL )
return pHead;
//对前两个结点进行操作
ListNode *pre = pHead;
pHead = pHead->next;
ListNode *nexthead = pHead->next; //第三个结点
//第一次反转
pHead->next = pre;
pre->next = NULL; //注意尾结点指向NULL
while( nexthead != NULL ){
//三个结点继续前移:,,,
pre = pHead; //pre新链表的头结点
pHead = nexthead; //phead原链表的头结点
nexthead = nexthead->next; //nexthead下一次原链表的头结点
//将原链表的头结点指向新链表的头结点
pHead->next = pre;
}
return pHead;
}
};