实现一个函数,完成链表的反转
思路:1.循环的方式
建立两个指针,前面的指针的next指向后面的指针,然后分别移动两个指针,循环到链表结尾
2.递归的方式
处理head结点的反转使用head->next->next = head,head->next = NULL,然后递归反转剩余的链表部分
.hpp文件
#ifndef LinkedList_hpp
#define LinkedList_hpp
#include <stdio.h>
#endif /* LinkedList_hpp */
struct LinkNode {
int val;
LinkNode *next;
};
LinkNode *reverseLink(LinkNode *head);
LinkNode *reverseLinkRecursive(LinkNode *head);
.cpp文件
//
// LinkedList.cpp
// CPlusPlusProject
//
//
//
//微信公众号:程序员开发环境
#include "LinkedList.hpp"
#include <iostream>
LinkNode *reverseLink(LinkNode *head){
//链表判空
if (head == NULL) {
return NULL;
}
//只有一个结点,无需反转
if (head->next == NULL) {
return head;
}
//firstNode为前面的结点,secondNode为后面的结点
LinkNode *firstNode = head;
LinkNode *secondNode = NULL;
while (firstNode->next != NULL) {
LinkNode *tmp = firstNode->next;
firstNode->next = secondNode;
secondNode = firstNode;
firstNode = tmp;
}
firstNode->next = secondNode;
return firstNode;
}
LinkNode *reverseLinkRecursive(LinkNode *head){
if (head == NULL) {
return NULL;
}
if (head->next == NULL) {
return head;
}
LinkNode *newHead = reverseLink(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
main函数
#include <iostream>
#include "LinkedList.hpp"
int main(int argc, const char * argv[]) {
int arr[] = {1, 2, 3, 4, 5, 6};
LinkNode *head = createLink(arr, 6);
LinkNode *result = reverseLinkRecursive(head);
std::cout<<result->val<<std::endl;
std::cout<<result->next->val<<std::endl;
return 0;
}