翻转链表
描述
翻转一个链表
样例
给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null
思路
1、 我们需要定义两个临时ListNode,一个保存当前节点下一个节点的地址(nextNode),一个保存当前节点上一个节点的地址(preNode)
2、 在一次循环中,我们需要保存当前节点的下一个节点的地址(nextNode)
2.1、我们需要更新当前节点的next指向,即指向我们保存的当前节点上一个节点的地址(preNode)
2.2、我们把保存的上一个节点的地址更新为当前节点;即它前面的节点都已经翻转完毕
2.3、我们更新当前节点为下一个节点的地址,我们在前面保存了
3、当我们遍历完所有节点时,我们只需要把我们的上一个节点的地址返回即可
好了,我们跟着思路实现一下
翻转函数
/**
* 思路:
* 1、我们需要定义两个临时ListNode,一个保存当前节点下一个节点的地址,一个保存当前节点上一个节点的地址
* 2、在一次循环中,我们需要保存当前节点的下一个节点的地址
* 2.1、我们需要更新当前节点的next指向,即指向我们保存的当前节点上一个节点的地址
* 2.2、我们把保存的上一个节点的地址更新为当前节点;即它前面的节点都已经翻转完毕
* 2.3、我们更新当前节点为下一个节点的地址,我们在前面保存了
* 3、当我们遍历完所有节点时,我们只需要把我们的上一个节点的地址返回即可
* @param head
* @return
*/
public static ListNode reverse(ListNode head) {
if(head == null || head.next == null) {
//链表为空或者只有一个节点的直接返回
return head;
}
ListNode preNode , nextNode;
preNode = nextNode = null;
while(head != null) {
nextNode = head.next;//保存当前节点的下一个节点
head.next = preNode;//翻转当前节点的指向
preNode = head;//更新上一个节点
head = nextNode;//更新当前节点
}
return preNode;
}
ListNode类
class ListNode{
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
this.next = null;
}
public static void showListNode(ListNode listNode) {
while(true) {
if(listNode.next == null ) {
System.out.print(listNode.val);
break;
}else {
System.out.print(listNode.val+"-->");
}
listNode = listNode.next;
}
}
}
测试函数
public static void main(String[] args) {
ListNode listNode = new ListNode(0);
for(int i = 1 ; i < 10 ; i++) {
ListNode temp = new ListNode(i);
temp.next = listNode;
listNode = temp;
}
ListNode.showListNode(listNode);
System.out.println();
listNode = reverse(listNode);
ListNode.showListNode(listNode);
}