思路:遍历链表的同时对链表进行反转,时间复杂度为O(1)。
首先定义一个前驱节点指向当前节点的前驱,当前节点指向当前节点,利用当前节点对链表进行遍历,当当前节点的next为空时说明到达最后一个节点,就让头结点等于最后一个节点,同时在循环中先记录当前节点的下一个节点。因为改变当前节点的指针,后继节点就丢失了。
package com.zf;
import java.util.Scanner;
//返转链表
public class JZ24 {
static class ListNode{
int val;
ListNode next=null;
public ListNode(int val) {
this.val = val;
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next().toString();
String[] arr=str.split(",");
int[] ints=new int[arr.length];
for(int i=0;i<arr.length;i++){
ints[i]=Integer.parseInt(arr[i]);
}
ListNode head=new ListNode(ints[0]);
ListNode cur=head;
for(int i=1;i<ints.length;i++){
ListNode node=new ListNode(ints[i]);
cur.next=node;
cur=node;
}
ListNode result=solution(head);
cur=result;
while(cur!=null){
System.out.print(cur.val+" ");
cur=cur.next;
}
}
public static ListNode solution(ListNode head){
if(head==null) return null;
ListNode pre=null;
ListNode cur=head;
while(cur!=null){
if(cur.next==null) head=cur;
ListNode curNext=cur.next;
cur.next=pre;
pre=cur;
cur=curNext;
}
return head;
}
}