1. 要求
反转一个链表,private LinkNode* reverse(LinkNode* p);
2. Code
private LinkNode* reverse(LinkNode* p) {
if(p == NULL) {
return p;
}
LinkNode* prev = NULL; // 在头结点前面虚拟1个空节点
LinkNode* next = p->next; // 记录后面的节点
while(next) { // 后面还有节点
p->next = prev; //将p指向prev
prev = p; // 后移
p = next;
next = p->next;
}
p->next = prev; // 后面已经没有节点了,只要将p指向prev就可以了
return p;
}
private LinkNode* reverse(LinkNode* p) {
return reverse(NULL, p);
}
private LinkNode* reverse(LinkNode* prev, LinkNode* p) {
if(p == NULL) {
return p;
}
LinkNode* next = p->next;
p->next = prev;
if(next == NULL) {
return p;
} else {
return reverse(p, next);
}
}
3. 说明
每次反转一个链接,记录后面的节点,反转后,向后移动。初始在最前面虚拟一个空节点,最后当后面没有节点的时候,只需要反转节点即可。