题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表定义如下:
class ListNode{
int value;
ListNode next;
ListNode(int value){
this.value = value;
}
}
直接上代码:
public class sortArrayByOddEven {
public static void main(String[] args) {
ListNode pHead = new ListNode(1);
ListNode pAhead = new ListNode(3);
ListNode pBhead = new ListNode(5);
ListNode pChead = new ListNode(7);
pHead.next = pAhead;
pAhead.next = pBhead;
pBhead.next = pChead;
pHead = reversalNode(pHead);
while (pHead != null) {
System.out.print(pHead.value + ",");
pHead = pHead.next;
}
}
private static ListNode reversalNode(ListNode pHead) {
if(pHead==null)
return null;
ListNode pNode = pHead;
ListNode next = null;
ListNode pre = null;
ListNode reservalNode = null;
while(pNode!=null) {
next = pNode.next;
if(next == null) {
return reservalNode; //当next==null时,Pnode则为我们需要返回当节点
}
pNode.next=pre; //pre每次保存上一个节点,将本节点.next 赋值为上一个节点
pre = pNode; //将本节点作为复制为pre 作为下一个节点当上节点。
pNode = next;//进行下一次循环
}
return reservalNode;
}
分析:这个是根据老师当代码改写成当java代码;
1)在分析后我们其实可以发现,在while循环中当if()判断句其实可以不要,我们优化代码
private static ListNode reversalNode(ListNode pHead) {
if(pHead==null)
return null;
ListNode pNode = pHead;
ListNode next = null;
ListNode pre = null;
while(pNode!=null) {
next = pNode.next;
pNode.next=pre; //pre每次保存上一个节点,将本节点.next 赋值为上一个节点
pre = pNode; //将本节点作为复制为pre 作为下一个节点当上节点。
pNode = next;//进行下一次循环
}
return pre;
}
这样是因为我们当pNode.next不存在时,我们保存当pre就是我们要返回当头节点,因此直接返回即可,不用再进行判断。