补充内容——带头结点的单链表+练习题


引言:

实现不带头节点单链表基本功能👉​​​​​​请看链接https://blog.csdn.net/weixin_45699237/article/details/121733085

由于不带头结点的单链表在实现一些功能上边不方便,常常得考虑到头节点是否存在,头节点是否为空的问题,为此,我们引入虚拟头节点,进一步优化我们的代码,也让在单链表在实现某些功能上可以更加简单操作。


package seqlist;

//创建一个头节点
public class SingleLinkedListWithHead {
    private int size; //当前存储元素个数
    private Node dummyHead = new Node(-1);// 虚拟头节点

    //添加方法
    public void addIndex(int index,int val){
        //判断index合法性
        if (index<0||index>size){
            System.err.println("add index illegal!");
            return;
        }
        //插入全部是中间节点
        Node node = new Node(val);
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        node.next = prev.next;
        prev.next = node;
        size++;
    }
    public void addFirst(int val){
        addIndex(0,val);
    }
    public void addLast(int val){
        addIndex(size,val);
    }
    public void removeIndex(int index){
        if (index<0||index>=size){
            System.err.println("remove index illegal!");
            return;
        }
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        prev.next = prev.next.next;
        size--;
    }
    public String toString() {
        String ret = "";
        Node node = dummyHead.next;
        while (node != null) {
            ret += node.val;
            ret += "->";
            node = node.next;
        }
        ret += "NULL";
        return ret;
    }

}
package seqlist;

public class Test {
    public static void main(String[] args) {
        SingleLinkedListWithHead singleLinkedListWithHead=new SingleLinkedListWithHead();
        singleLinkedListWithHead.addFirst(1);
        singleLinkedListWithHead.addLast(3);
        singleLinkedListWithHead.addIndex(1,3);
        System.out.println(singleLinkedListWithHead);//1->3->3->NULL
        singleLinkedListWithHead.removeIndex(0);
        System.out.println(singleLinkedListWithHead);//3->3->NULL
    }
}

删除链表重复节点

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针 。

package seqlist.leetcode;

public class solution {
    public static void main(String[] args) {
        ListNode head = build();
        solution solution = new solution();
        ListNode newHead = solution.deleteDuplication(head);
        System.out.print(newHead.toString(newHead));
    }

    private static ListNode build() {
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(7);
        ListNode node3 = new ListNode(7);
        ListNode node4 = new ListNode(7);
        ListNode node5 = new ListNode(7);
        ListNode node6 = new ListNode(8);
        ListNode node7 = new ListNode(9);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        node6.next = node7;
        return node1;
    }

//删除链表重复节点:在一个排序的链表中,存在重复的结点,
//请删除该链表中重复的结点,重复的结点不保留,返回链表头指针
    public ListNode deleteDuplication(ListNode pHead){
        if (pHead == null || pHead.next == null){
            return pHead;
        }
        ListNode dummy = new ListNode(0);//头节点
        dummy.next = pHead;
        ListNode pre = dummy;
        ListNode cur = pHead;
        while (cur!=null){
            // 如果cur和cur.next的值相等,那么把cur移动到重复节点的最后一个节点
            if (cur.next!=null && cur.val == cur.next.val){
                while (cur!=null && cur.next!=null && cur.val==cur.next.val){
                    cur=cur.next;
                }
                // 连接pre和cur.next,构造不重复的节点
                pre.next=cur.next;
                cur=cur.next;
            }else {
                // pre和cur都后移一位
                pre=pre.next;
                cur=cur.next;
            }
        }
        return dummy.next;
    }
}

本节完^_^

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘻嘻-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值