题目:将一个有链表头的单向单链表逆序
分析:
链表为空或只有一个元素直接返回;
设置两个前后相邻的指针p,q,使得p指向的节点为q指向的节点的后继;
重复步骤2,直到q为空;
调整链表头和链表尾;
图解:
以链表A->B->C->D为例,逆序此链表。
0.初始状态 1.2.3 循环部分
p = head->next; while(q!=null){
q = head->next->next; t = q->next;
t = null; q->next = p;
p = q;
q = t;
}
0.初始状态
1.第一次循环
2.第二次循环
3.第三次循环
4.q==null循环结束
head->next->next = null;//设置链表尾
head-next = p;//修改链表头
实现及测试代码
节点Node类:
packagelinkList.reverse;/*** 链表节点
*@authorAdministrator
**/
public classNode {private Integer data;//节点数据域
private Node next;//节点指针域
publicInteger getData() {returndata;
}public voidsetData(Integer data) {this.data =data;
}publicNode getNext() {returnnext;
}public voidsetNext(Node next) {this.next =next;
}
}
逆序方法:
/***
*@paramnode 原始链表头节点
*@return逆序后链表头节点*/Node reverseList(Node head){//如果链表为空或只有一个元素直接返回
if(head.getNext()==null||head.getNext().getNext()==null){returnhead;
}
Node p=head.getNext();
Node q=head.getNext().getNext();
Node t= null;while(q!=null){
t=q.getNext();
q.setNext(p);
p=q;
q=t;
}//设置链表尾
head.getNext().setNext(null);//修改链表头
head.setNext(p);returnhead;
}
测试代码:
//表头
Node head = newNode();
head.setData(-1);
head.setNext(null);//定义指针
Node p;
p=head;//初始化链表数据[1~10]
for(int i=1;i<=10;i++){
Node q= newNode();
q.setData(i);
q.setNext(null);
p.setNext(q);
p=q;
}//输出原始链表
printList(head);
System.out.println("");//输出逆序后的链表
printList(reverseList(head));