题目描述
输入一个链表,反转链表后,输出链表的所有元素。
思路:借助图形来分析一下反转链表需要改变哪些指针。假设某一时刻,经过若干操作,我们已经把h点之前的指针调整完毕,现在反转i指针指向的结点。
由图可知,为了防止指针的断开,需要保存i的next指针,为了完成反转,需要知道i的前一个指针prev,当然也要有个当前指针用作遍历链表,即总共三个指针分别是:pNode,pNext,pPrev。经过分析,可以写出以下代码:
public class Solution {
/*public static class ListNode{
int val;
ListNode next=null;
ListNode(int val){
this.val=val;
}
}*/
public static ListNode ReverseList(ListNode head) {
if(head==null)
return null;
ListNode pNode=head;
ListNode pPrev=null;
ListNode pNext=null;
ListNode pReversedHead=null;
while(pNode!=null){
pNext=pNode.next;
if(pNext==null){//tail Node
pReversedHead=pNode;
}
//反转,即令i的next指向pPrev
pNode.next=pPrev;
pPrev=pNode;
pNode=pNext;
}
return pReversedHead;
}
public static void printList(ListNode head){
ListNode pHead=head;
while(pHead!=null){
System.out.print(pHead.val+" ");
pHead=pHead.next;
}
}
/*public static void main(String[] args){
List<ListNode> list=new ArrayList<ListNode>();
list.add(new ListNode(1));
list.add(new ListNode(2));
list.add(new ListNode(3));
list.add(new ListNode(4));
list.add(new ListNode(5));
list.add(new ListNode(6));
for(int i=0;i<list.size();i++){
ListNode listNode=list.get(i);
if(i+1<list.size()){
listNode.next=list.get(i+1);
}
}
//print ReverseList
printList(ReverseList(list.get(0)));
}*/
}