0
点赞
收藏
分享

微信扫一扫

java笔试题系列之:从无序链表中移除重复项



java笔试题系列之:从无序链表中移除重复项

  • 顺序删除


题目描述:
给定一个没有排序的链表,去掉其重复项,并保留原顺序,如链表1->3->1->5->5->7,去掉重复项后变为1->3->5->7。

单链表数据结构:

public class LNode {
    int data;
    LNode next;
}

顺序删除

主要思路为:

  • 通过双重循环直接在链表上执行删除操作。
  • 外层循环用一个指针从第一个节点开始遍历整个链表,然后内层循环用另外一个指针遍历其余节点,将与外层循环遍历到的指针所指节点的数据域相同的节点删除

假设外层循环从outerCur开始遍历,当内层循环遍历的节点outerCur.data==innerCur.data时,需要把innerCur指向的节点删除。

具体步骤如下:

  • 用tmp记录待删除的节点的地址
  • 为了能够在删除tmp节点后继续遍历链表中其余的节点,使innerCur指针指向它的后继节点:innerCur=innerCur.next
  • 从链表中删除tmp节点

public class removeDupElement {

    /**
     * 方法功能:对带头节点宕无序单链表删除重复宕节点
     * @param head:链表头节点
     */
    public static void removeDup(LNode head){
        if(head == null || head.next == null)
            return;
        //用于外层循环,指向链表第一个节点
        LNode outerCur = head.next;
        //内层循环用来遍历outerCur后面的节点
        LNode innerCur = null;
        //innerCur的前驱节点
        LNode innerPre = null;

        for(;outerCur!=null;outerCur=outerCur.next){
            for(innerCur=outerCur.next,innerPre=outerCur;innerCur!=null;){
                //找到重复的节点并删除
                if(outerCur.data==innerCur.data){
                    innerPre.next = innerCur.next;
                    innerCur = innerCur.next;
                }else{
                    innerPre = innerCur;
                    innerCur = innerCur.next;
                }
            }
        }

    }

    public static void main(String[] args) {
        int i = 1 ;
        LNode head = new LNode();


        head.next = null;

        LNode tmp = null;
        LNode cur = head;

        for(;i<7;i++){
            tmp = new LNode();
            if(i%2==0)
                tmp.data = i + 1;
            else if(i%3 == 0)
                tmp.data = i - 2;
            else
                tmp.data = i;
            tmp.next = null;
            cur.next = tmp;
            cur = tmp;
        }

        System.out.println("删除重复节点前:");
        for(cur=head.next;cur!=null;cur=cur.next)
            System.out.print(cur.data + "");

        removeDup(head);
        System.out.println("\n删除重复节点后: ");
        for(cur=head.next;cur!=null;cur=cur.next)
            System.out.print(cur.data+"");

    }
}

输出如下所示:

java笔试题系列之:从无序链表中移除重复项_System


举报

相关推荐

0 条评论