【JAVA】java链表的基本操作

对于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   
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值