反转链表

题目:输入一个链表,反转链表后,输出链表的头结点。

分析

  看上去很简单,对于每一个结点,如果它的前一个结点不为null,则它的next都改为指向它的前一个结点。但是,要注意的是:当这个结点的next指向前一个结点时,会出现链表的断裂,所以需要在改变next之前记录一下它的下一个结点,当next改变后,把需要操作的那个结点向后移动到刚刚记录的下一个结点。当一个结点的next为null时,那个结点就是尾结点,这时只需要把尾结点的next改变一下循环就可以结束了,最后输出头结点即可。

为了代码的鲁棒性,需要考虑到三种情况:

1. 输入的链表为空
2. 输入的链表仅有一个结点
3. 输入的链表有多个结点

代码实现

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null)//链表为空的情况
return null;
ListNode newHead = null;
ListNode pNode = head;
ListNode pPrev = null;
while(pNode!=null){
ListNode pNext = pNode.next;
if(pNext==null)//尾结点变成头结点,用newHead记录要输出的值
newHead = pNode;

pNode.next = pPrev;//next指针的改变

//移动操作点,这里注意的是需要移动当前结点,和前一个结点,两个
pPrev = pNode;
pNode = pNext;
}
return newHead;
}
}

总结

  1. 没什么说的,考虑到输入的三种情况即是好代码。