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

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补充内容——带头结点的单链表+练习题相关的知识,希望对你有一定的参考价值。


引言:

实现不带头节点单链表基本功能👉​​​​​​请看链接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;
    

本节完^_^

以上是关于补充内容——带头结点的单链表+练习题的主要内容,如果未能解决你的问题,请参考以下文章

不带头结点的单链表L,设计一个递归算法逆序输出所有结点值

数据结构-链表链表的相关算法

求不带头结点的单链表的逆置算法?

什么叫带头结点的链表? 什么叫不带头结点的链表?

单链表练习题

单链表创建之--头插法创建带头结点的单链表,超详细