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
相关文章推荐
- java的反射机制浅谈
- 网上商城项目实战之springmvc配置
- java快捷键
- 15-11-16 Eclipse 操作菜单汉译之 Refactor [重构]
- Java到底是传引用还是传值?
- Java的内部类和匿名内部类的使用规则
- Java:public、private、protected修饰符
- java BigDecimal用法
- spring mvc 集成 thymeleaf ----注解
- spring mvc 配置 thymeleaf
- Java中强引用、弱引用、软引用、虚引用
- java项目中logger一般使用 static final
- eclipse 配置scala问题-More than one scala library found in the build path
- Java笔记 _反射
- Java由先序序列和中序序列还原二叉树
- Java由先序序列和中序序列还原二叉树
- synchronized的实现原理-java并发编程的艺术读书笔记
- Java finally语句到底是在return之前还是之后执行?
- spring mvc aop 拦截 附近上传
- java spring - 自动装配Bean 注解大全