题目
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思路
三个指针。curr指向当前节点,prev指向curr的前一节点,temp指向curr的下一节点(curr.next)。
1.temp = curr.next; //后面要改变curr.next的指向,所以改变之前用temp临时存储;
2.curr.next = prev; //反转,curr.next指向curr的前一节点prev;
3.反转操作完成后,分别移动指针(curr、prev)到各自的下一个节点,以便进行下一次操作。
prev = curr;
curr = temp;
代码实现
/*
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 head;
ListNode prev = head;
ListNode curr = head.next;
ListNode temp = null;
head.next = null;
while(curr!=null){
temp = curr.next;//temp,临时存储curr.next
curr.next = prev; //反转操作
prev = curr; //移动prev指针
curr = temp;//移动curr指针
}
return prev;
}
}
注:1.head在反转后在表尾,所以head.next=null;
2.还有递归版本。
3.运行环境:牛客网OJ。