单链表删除节点,插入节点,反转链表,删除重复节点

  • 删除节点

删除节点重要的是创建两个指针:pre和cur,pre指向前一个元素,cur指向当前元素,cur.link指向下一个元素。并要注意头结点是目标节点时要单独讨论。

        public void deleteItem(int n){
            ListNode pre = null;
            ListNode cur = head;
//            如果头节点是要删除的节点,情况比较复杂,需要单独讨论
            if (head.data == n){
                head = head.link;
                cur.link = null;
                return;
            }
//            在头节点不是目标节点的情况下,根据循环寻找目标节点
//            cur指针所在位置是目标节点就交换位置,不是目标节点就让指针向下移动
//            删除节点后记得结束方法
            while(cur != null){
                if (cur.data == n){
                    pre.link = cur.link;
                    cur.link = null;
                    return;
                }else{
                    pre = cur;
                    cur = cur.link;
                }
            }
        }
  • 插入节点

//        把节点newnode插入到值为k的节点后面
        public void insertItem(ListNode newnode,int k){
            ListNode cur = head;
            while(cur != null){
                if (cur.data ==k){
                    newnode.link = cur.link;
                    cur.link = newnode;
                    return;
                }else{
                    cur = cur.link;
                }
            }
        }
  • 反转链表(我下面使用的是迭代解法)

//让cur.link=pre之后让cur和pre两个指针向后移动,继续让cur.link=pre直到cur=null        
            public void reverseList(){
//如果链表内没有元素或者只有一个元素不必反转
            if (head == null || head.link == null){
                return;
            }
//定义三个指针
            ListNode pre = null;
            ListNode cur = head;
            ListNode temp = null;
//只要当前指针不为空就需要反转,在pre和cur两个指针向后移动时需要借助一个中介指针temp
            while(cur!=null){
                temp = cur.link;
                cur.link = pre;
                pre = cur;
                cur = temp;
            }
//最终cur指针一定为空,所以pre指针处的元素就是反转链表的头节点
            head = pre;
        }
  • 删除重复节点

    public void RemoveRep(){
        ListNode cur = head;
//如果cur的下一个和cur相同,就删除,如果不同进行下一个循环
        while(cur.link != null){
            if(cur.data == cur.link.data){
                ListNode temp = cur.link;
                cur.link = cur.link.link;
                temp.link = null;
            }else{
                cur = cur.link;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值