此题出自牛客网的剑指offer专题
题目描述
输入一个链表,反转链表后,输出新链表的表头。
题目分析:
这一道题算是一道比较经典的题目了。为了实现链表翻转,我们需要使用一个结点指针(在Java中因为没有指针,所以我们可以使用引用)以及记录下一个结点的指针来记录链表中的前一个结点以及后一个结点,这里为了方便以及书写代码时逻辑清晰点,我又使用了指向当前结点的指针以及顾名思义的newHead指针。
代码如下:
Java版本:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null){
return null;
}
ListNode preNode = null;
ListNode nextNode = null;
ListNode currentNode = head;
ListNode newHead = null;
while(currentNode != null){
nextNode = currentNode.next;
if(nextNode == null){
newHead = currentNode;
}
currentNode.next = preNode;
preNode = currentNode;
currentNode = nextNode;
}
return newHead;
}
}
C++版本:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode* newHead = NULL;
ListNode* preNode = NULL;
ListNode* nextNode = NULL;
ListNode* currentNode = pHead;
while(currentNode){
nextNode = currentNode->next;
if(nextNode==NULL){
newHead = currentNode;
}
currentNode->next = preNode;
preNode = currentNode;
currentNode = nextNode;
}
return newHead;
}
};