2020-09-19

2020/09/18

问题1:从尾到头打印链表
链表来反转即可:

//从尾到头打印链表
public  static  int [] reversePrint(ListNode head){
    if(head == null) return  null;
    int countlength =0;
    ListNode conNode = head;
    while (conNode != null){
        countlength++;
        conNode = conNode.next;
    }
    int nodes[] = new int[countlength];
    while (head != null){
        nodes[--countlength] = head.val;
        head = head.next;

    }
    return nodes;
}

问题2:移除未排序链表中重复节点,保留最开始出现的节点
解法1:使用临时缓冲区,set去重

//一般想到去重,首先就想到set去重,是一个临时缓冲区的形式
public static ListNode removeNodes(ListNode head){
    HashSet<Integer> set = new LinkedHashSet<>();
    ListNode cur = head;
    while (cur !=  null && cur.next != null){
        set.add(cur.val);
        if(set.contains(cur.next.val))
            cur.next = cur.next.next;
        else
            cur = cur.next;
    }
    return  head;
}

解法二:使用双指针,不需要额外空间

//不使用额外空间,可以使用双指针实现,采用两层while循环
public static ListNode removeNodes2(ListNode head){
    if(head == null) return  null;
    while (head != null){
        ListNode node = head.next;
        while (node != null && node.next != null){
            //寻找相同节点的上一个节点
            if(head.val == node.next.val){
                node.next = node.next.next;
            }
            node = node.next;

        }
        head = head.next;

    }
    return  head;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值