题目:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。例如图:

剑指offer24:反转链表_链表


分析:

需要三个指针。第一个指针指向该节点(遍历时指向的节点),第二个指针指向该节点前一个节点,为了能改变指针方向所以有此指针,例如a指向b,改为b指向a,第三个指针是指向该节点后一个节点,为了能够顺利遍历从而保存该节点下一个节点。具体操作看代码即可。

时间复杂度O(n),空间复杂度O(1)。

public class ReverseList {
public static void main(String[] args) {
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(3);
ListNode l4 = new ListNode(4);
ListNode l5 = new ListNode(5);
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l5;
System.out.println(l1);
ListNode listNode = reverseList(l1);
System.out.println(l5);
}
public static ListNode reverseList(ListNode head){
ListNode pre =null;
ListNode cur = head;
while (cur !=null){
// next用来保存下一个节点
ListNode next = cur.next;
// 开始改变指针方向了
cur.next = pre;
// 前驱指针移动到该节点位置
pre = cur;
//该节点移动到下一个节点位置
cur = next;
}
return pre;
}
}

剑指offer24:反转链表_算法_02