数据结构——链表常见算法(2)

55 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

在上一篇中,我们介绍了链表的倒置排序方法,在本篇中我们也将研究链表的常见算法。

链表常见算法

(1)将两个有序链表进行合并

在本题中,我们将给出两个升序排列的链表,试着将两个链表进行合并,要求新链表是通过拼接给定的两个链表的所有节点组成的。

image.png

根据题目给定要求,我们需要构建一个介绍两个LIst对象的方法,并返回一个List对象。

public List mergeList(List list1, List list2)
{
    List newLIst = new List();  
    Node p = list1.head.next;
    Node q = list2.head.next;
    while( p != null && q != null )
    {
        if(p == null)
        {
            newLIst.append(q.value);
            q = q.next;            
        }else if(q == null)
        {
            newLIst.append(p.value);
            p = p.next;
        }else{
            if(p.value - q.value > 0)
            {
                newLIst.append(q.value);
                q = q.next;           
            }else{
                newLIst.append(p.value);
                p = p.next;
            }
        }
    }
    return newLIst;
}

在这个实现方法中,我们分别使用指针p和指针q来为我们分别在链表list1、链表list2中获取元素。当pq两个指针都为null时,则说明链表list1和链表list2中的元素已经全部取出,故合并链表已经完成。

当指针p或指针q其中一方为null时,则说明其中一方的元素已全部添加至新链表中,而后直接另一条链表中剩余的所有元素全部添加至新链表末位就好了。

(2)奇偶链表

给定单链表 ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

image.png

public List oddEvenList(List list) {
    Node even = list.head;  // 偶数节点头指针
    Node odd = even.next;   // 奇数节点头指针
    Node evenEnd = list.head;   // 偶数节点尾指针
    Node oddEnd = even.next;    // 奇数节点尾指针
    boolean isOdd = true;   // 判断当前节点是否为奇数节点
    for(Node p = list.head.next; p != null; p = p.next, isOdd = !isOdd)
    {
        if(isOdd)
            evenEnd.next = p;
        else
            oddEnd.next = p;
    }
    oddEnd.next = even;
    return list;
}

这个方法就是一个链表分离聚合算法,我们先将链表中的一个个元素按要求分离成多个“链表”,然后再将其聚合成一条。在这个方法中,我们使用多个指针来分别构建出了两个“链表”,用以存储原有链表中的奇数节点偶数节点。然后我们使用Boolean类型的变量isOdd来区分当前节点是奇数节点还是偶数节点。

小结

本章同样讲解了链表的相关的两个算法实现。

天天学习,加速成长!

希望与各位一起变得越来越强!

\