您的位置:首页 > 编程语言 > Java开发

java链表的基本操作

2015-11-16 19:41 579 查看
对于java链表一直有点熟悉但是又陌生的感觉,因为有的时候增删改查,明明知道是这个原理,可是一次性就正确的把代码码下来却做不到。总会不知道为何好端端的一个链表却不知怎么改变了,或许是因为某个赋值,或许是某次遍历或者删除,等等,头疼的感觉,先不管那么多了,先把自己调试差不多正确的代码,记录下,平时多看几遍,或许就能知道点东西。

import java.util.Scanner;

class ListNode {
int val;
ListNode next = null;
ListNode(){

}
ListNode(int val) {
this.val = val;
}
}
public class ListNodeOperation {
//创建链表
public ListNode createListNode(){
System.out.println("请输入节点值以-1结束");
Scanner scan = new Scanner(System.in);
ListNode pHead= new ListNode();
int temp;
if((temp=scan.nextInt())==-1){//头结点
return null;
}else{
pHead.val=temp;
}
ListNode p =pHead;
while((temp=scan.nextInt())!=-1){
ListNode q = new ListNode(temp);
p.next=q;
p=p.next;
}
p.next=null;
return pHead;
}
//打印链表
public void display(ListNode pHead){
while(pHead!=null){
System.out.print(pHead.val+"\t");
pHead=pHead.next;
}
System.out.println();
}
//在某位置增加一个节点,pos=0表示在头结点前插入
public ListNode addNode(ListNode pHead,int pos,int value){
ListNode q = new ListNode(value);
if(pos<0){
System.out.println("插入失败");
return pHead;
}
if(pos==0){//在头结点前插入
q.next=pHead;
return q;
}
ListNode p = pHead;
while((--pos)>0&&p!=null){
p=p.next;
}
if(p==null){
System.out.println("插入失败!");
return pHead;
}
q.next=p.next;
p.next=q;
return pHead;

}
//删除某个节点,pos=0,表示删除头结点
public ListNode deleteNode(ListNode pHead,int pos){
ListNode p = pHead;
if(pos<0){
System.out.println("删除失败");
}
if(pos==0){//删除头结点
p=p.next;
return p;
}
while((--pos)>0&&p!=null){
p=p.next;
}
if(p==null){
System.out.println("删除失败");
return pHead;
}
p.next=p.next.next;
return pHead;
}
//删除排序后的重复节点(重复节点只留一个)
public ListNode deleteReNode(ListNode pHead){
ListNode p = pHead;
while(p!=null){
if(p.next!=null&&p.val==p.next.val){
p.next=p.next.next;
}else{
p=p.next;
}
}
return pHead;
}
//删除排序后的重复节点(重复节点都删除)
public ListNode deleteReNodeAll(ListNode pHead){
ListNode p = pHead;//链表遍历指针
ListNode newHead=new ListNode();//用于存放不重复节点
ListNode q=newHead;//新链表的构建指针
ListNode pre=p;
while(p!=null){
if(p.next!=null&&p.val==p.next.val){//如果当前节点后下一个节点相同,则p往后移
p=p.next;

}else if(p.next!=null){//如果当前节点的值和后一节点的值不同,则当前节点是有可能不是重复节点,判断pre是否等于p
if(pre==p){//如果pre==p,说明p当前节点不是重复节点,则将该节点加入newHead中
q.next=new ListNode(p.val);
q=q.next;
}
pre=p.next;
p=p.next;
}else{//如果p.next为null
if(p==pre){
q.next=new ListNode(pre.val);
q=q.next;
}
break;
}
}
q=null;
return newHead.next;
}
public static void main(String[] args) {
ListNodeOperation cls = new ListNodeOperation();
ListNode pHead =  new ListNode();
System.out.println("创建链表");
pHead=cls.createListNode();
cls.display(pHead);
System.out.println("链表pos处增加节点");
pHead=cls.addNode(pHead, 2, 3);
cls.display(pHead);
System.out.println("删除链表pos处节点");
pHead=cls.deleteNode(pHead, 2);
cls.display(pHead);
System.out.println("删除链表的重复值,但是保留一个");
cls.deleteReNode(pHead);
cls.display(pHead);
System.out.println("删除链表的重复值");
pHead=cls.deleteReNodeAll(pHead);
cls.display(pHead);
}
}
运行结果
创建链表
请输入节点值以-1结束
1 2 3 4 4 5 5 6 -1
1   2   3   4   4   5   5   6
链表pos处增加节点
1   2   3   3   4   4   5   5   6
删除链表pos处节点
1   2   3   4   4   5   5   6
删除链表的重复值,但是保留一个
1   2   3   4   5   6
删除链表的重复值(这个上面的链表被改变了,所以其实得不到下面的结果,这是我手动改了下)
1   2   3   6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: