天天看点

剑指offer面试题24:反转链表

题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表定义如下:

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就是我们要返回当头节点,因此直接返回即可,不用再进行判断。