015 反转链表

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 }

猜你喜欢

转载自www.cnblogs.com/juncaoit/p/10435260.html