题目描述
输入一个链表,反转链表后,输出新链表的表头。
题目分析
该题目有两种解题思路,递归方式与非递归方式,直接给出代码,在代码中给出重要问题及其解释
java代码(非递归)
static class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public ListNode ReverseList(ListNode head) {
// 翻转链表有一个关键,就是要使用三个指针来防止链表断裂
// 1. 当前指针pNode,用来遍历链表
// 2. pNode的前一指针 pPre,用来记录pNode.next = pPre
// 3. pNode的后指针 pNext,用来给调整指向的pNode赋值,pNode = pNext
// 另一个关键点就是,到达那个节点为翻转链表的链表头结点,显然党pNext=null 时,Pnode为链表头节点
ListNode ReverseListHead = null;
ListNode pNode = head;
ListNode pPre = null;
while(pNode!=null){
ListNode pNext = pNode.next;
if(pNext == null){
ReverseListHead = pNode;
}
// 先修改pNode.next的指向,在更改pPre的值
pNode.next = pPre;
pPre = pNode;
pNode = pNext;
}
return ReverseListHead;
}
public void Print(ListNode head){
ListNode p = head;
while(p!=null){
System.out.print(p.val + "--->");
p = p.next;
}
System.out.println("null");
}
public static void main(String[] args) {
int num = 5;
ListNode[] a = new ListNode[num];
for(int i = 0;i<num;i++){
a[i] = new ListNode(i);
// a[i].next = a[i+1];
}
for(int i = 0;i<num-1;i++){
a[i].next = a[i+1];
}
// a[num-1].val = num-1;
a[num-1].next = null;
NK5_reverseList nk = new NK5_reverseList();
nk.Print(a[0]);
nk.Print(nk.ReverseList(a[0]));
}
java代码(递归)
static class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
// 使用递归来解决这个问题
ListNode ReverseList(ListNode head) {
//如果链表为空或者链表中只有一个元素
if(head == null||head.next==null){
return head;
}
//先反转后面的链表,走到链表的末端结点
ListNode pReverseNode=ReverseList(head.next);
//再将当前节点设置为后面节点的后续节点
ListNode T = head.next; //将head.next后面的链表看为一个整体,修改指向
T.next=head; // 翻转链表
head.next=null;
return pReverseNode;
}
public void Print(ListNode head){
ListNode p = head;
while(p!=null){
System.out.print(p.val + "--.");
p = p.next;
}
System.out.println("null");
}
public static void main(String[] args) {
int num = 5;
ListNode[] a = new ListNode[num];
for(int i = 0;i<num;i++){
a[i] = new ListNode(i);
// a[i].next = a[i+1];
}
for(int i = 0;i<num-1;i++){
a[i].next = a[i+1];
}
// a[num-1].val = num-1;
a[num-1].next = null;
NK5_reverseList2 nk = new NK5_reverseList2();
nk.Print(a[0]);
nk.Print(nk.ReverseList(a[0]));
}