1.题目
输入一个链表,反转链表后,输出新链表的表头。
2.思路
本题的关键就是在于对next域的赋值,同时对下一个节点进行保存,然后对把下一个节点赋给新的节点,这样依次循环完所有的节点。每次使新插入的节点变成头第一个有效节点
3.程序
1 package first; 2 3 public class ReverseList { 4 public static void main(String[] args){ 5 ListNode head = new ListNode(); 6 ListNode second = new ListNode(); 7 ListNode third = new ListNode(); 8 ListNode forth = new ListNode(); 9 head.next = second; 10 second.next = third; 11 third.next = forth; 12 head.val = 1; 13 second.val = 2; 14 third.val = 3; 15 forth.val = 4; 16 ReverseList test = new ReverseList(); 17 ListNode result = test.ReverseList(head); 18 // System.out.println(result.val); 19 } 20 21 22 public static ListNode ReverseList(ListNode head) { 23 24 if(head==null) 25 return null; 26 //head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null; 27 ListNode pre = null; 28 ListNode next = null; 29 //当前节点是head,pre为当前节点的前一节点,next为当前节点的下一节点 30 //需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2 31 //即pre让节点可以反转所指方向,但反转之后如果不用next节点保存next1节点的话,此单链表就此断开了 32 //所以需要用到pre和next两个节点 33 //1->2->3->4->5 34 //1<-2<-3 4->5 35 while(head!=null){ 36 //做循环,如果当前节点不为空的话,始终执行此循环,此循环的目的就是让当前节点从指向next到指向pre 37 //如此就可以做到反转链表的效果 38 //先用next保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂 39 next = head.next; 40 //保存完next,就可以让head从指向next变成指向pre了,代码如下 41 head.next = pre; 42 //head指向pre后,就继续依次反转下一个节点 43 //让pre,head,next依次向后移动一个节点,继续下一次的指针反转 44 pre = head; 45 head = next; 46 47 } 48 //如果head为null的时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表的第一个节点 49 //直接输出pre就是我们想要得到的反转后的链表 50 System.out.print(pre.val); 51 return pre; 52 } 53 54 55 public static ListNode ReverseList2(ListNode head) { 56 if(head == null) 57 return null; 58 //记录当前节点的前一个节点 59 ListNode prenode = null; 60 //记录当前节点的后一个节点 61 ListNode aftnode = head.next; 62 //当前节点 63 ListNode innode = head; 64 //将头节点改为尾节点 65 head.next = null; 66 prenode = head; 67 //指针指向下一个节点 68 head = aftnode; 69 70 while(head !=null){ 71 //1.记录该节点的后一个节点 72 //2.将该节点的next指向前一个节点 73 //3.将该节点的指针后移 74 //4.修改该移动后的pre节点。 75 aftnode = head.next; 76 head.next = prenode; 77 prenode = head; //以前的prenode是真的pre,现在head变成pre了,就是指针后移了 78 head = aftnode; 79 80 } 81 return prenode; 82 } 83 }