题目:定义一函数,输入链表的头结点,反转该链表并输出反转后的链表头结点。
因为在反转一个节点时,需要把该节点的指针域指向其前一节点,这样就无法访问其后续节点。所以,需要有三个指针分别指向当前节点,前一节点以及后一节点。同样,习惯使用带有头结点的链表结构,第一个数据域为head.next。代码如下:
public static ListNode reversedList(ListNode head){
//我们使用有头结点的链表结构即第一个数据节点为head.next
//cur初始指向第一个数据节点,pre初始为空
ListNode reversedHead=new ListNode();
ListNode pre=null;
ListNode cur=head.next;
//当前节点的next为空,说明到尾节点了,只需将head的next指向尾节点即可
while(cur!=null){
ListNode next=cur.next;
if(next==null){
reversedHead.next=cur;
}
//倒转节点next域并向后移动一节点位置
cur.next=pre;
pre=cur;
cur=next;
}
//返回的仍然是head 不过此时head的next域 是原来链表的尾节点了
return reversedHead;
}
测试下效果:
public static void main(String[] args) {
// TODO Auto-generated method stub
ListNode head=new ListNode();
ListNode node1=new ListNode();
ListNode node2=new ListNode();
ListNode node3=new ListNode();
head.next=node1;
node1.value=1;
node1.next=node2;
node2.value=2;
node2.next=node3;
node3.value=3;
ListNode.printStr(head);
ListNode reversedHead=reversedList(head);
ListNode.printStr(reversedHead);
ListNode.printStr(reversedList(new ListNode()));
}
public static void printStr(ListNode head) {
if (head == null)
return;
ListNode pNode = head.next;
while (pNode != null) {
if(pNode.next==null){
System.out.print(pNode.value);
System.out.println();
pNode = pNode.next;
}else{
System.out.print(pNode.value);
System.out.print("->");
pNode = pNode.next;
}
}
}
}
输出如下:
1->2->3
3->2->1