单链表是一种常见的数据结构,由一个一个结点通过指针方式连接而成,每个结点由两个部分组成:一 是数据域,用于存储结点数据,二 是指针域,用于存储下一个结点的地址.
这个题在面试题中会经常考到,划重点!!!
思路:
所谓的单链表反转就是把每个节点的指针域由原来的指向下一个结点改为指向其前一个结点,但由于单链表没有志向前一个结点的指针域,因此需要增加一个指向前一个结点的指针prev,用于存储每一个结点的前一个结点,,此外,还需要定义一个保存当前结点的指针curr,以及下一个结点的next,定义好这三个后,就遍历单链表,将当前指针指向前一个结点,之后将定义好的三个指针向后移动,直到遍历到最后一个结点停止.
代码展示:
package com.bittech;
/**
* Author:weiwei
* description:反转一个单链表
* Creat:2019/5/6
**/
public class ReverseList {
private static class ListNode{
int val;
ListNode next;
ListNode(int x){
val = x;
}
}
public static ListNode ReverseList(ListNode head){
/**
* 思路:存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。
* 在遍历列表时,将当前节点的 next 指针改为指向前一个元素。
* 由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。
* 在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
*/
ListNode prev = null; //前一个结点
ListNode curr = head; //当前结点
while(curr != null){
ListNode nextTemp = curr.next; //指向下一个结点
curr.next = prev; //将当前结点的next域指向前一个结点
prev = curr; //prev向后移动
prev = nextTemp; //curr向后移动
}
return prev;
}
}