翻转链表中,相邻元素不相等的节点,就离谱,没刷多少算法题的我,毕业即失业了!!!!

翻转链表中,相邻元素不相等的节点(建信金科的题目,不知道力扣有没有原题)

比如 1 2 2 3 4 5 6 6 7 8 9 -> 1 2 2 5 4 3 6 6 9 8 7
可以用一个队列,将所有节点先入队,然后再依次出队.
定义两个指针p1,p2 p1指向队头,p2指向下一个.
比如上面入队后再出队,p1先指向1,p2指向2 然后先判断1和2不相等,将1以头插法的形式插入.然后p1继续指向下一个,是2,这时p2指向下一个,也是2.
此刻判断到相等,先循环得到链表的尾结点,然后理解尾插法将该两个节点插入,之后再遍历到尾结点.依次循环就出来了,搞了一个多小时,笔试没写出来,呜呜呜

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

class ListNode {
    int val;
    ListNode next = null;
    public ListNode(int val) {
      this.val = val;
    }
  }
public class Main {
    public static void main(String[] args) {
        ListNode listNode = new ListNode(1);
        ListNode listNode1=new ListNode(2);
        ListNode listNode2=new ListNode(2);
        ListNode listNode3=new ListNode(3);
        ListNode listNode4=new ListNode(4);
        ListNode listNode5=new ListNode(9);
        ListNode listNode6=new ListNode(9);
        ListNode listNode7=new ListNode(8);
        ListNode listNode8=new ListNode(7);
        listNode.next=listNode1;
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        listNode5.next=listNode6;
        listNode6.next=listNode7;
        listNode7.next=listNode8;
        Main main = new Main();
        ListNode listNode9 = main.reverseList(listNode);
        while (listNode9!=null){
            System.out.print(listNode9.val+" ");
            listNode9=listNode9.next;
        }
    }


    public ListNode reverseList (ListNode head) {
        // write code here
        ListNode newHead=new ListNode(-1);
        Queue<ListNode> queue=new LinkedList<>();
        while (head!=null){
            queue.offer(head);
            head=head.next;
        }
        ListNode tailNode=newHead;

        while (tailNode.next!=null){
            tailNode=tailNode.next;
        }
        while (!queue.isEmpty()){
            ListNode poll = queue.poll();
            ListNode pollnext=null;
            if (!queue.isEmpty()){
                 pollnext= queue.peek();
            }
            if (pollnext==null){
                //头插法
                poll.next=tailNode.next;
                tailNode.next=poll;
            }else{
                if (pollnext.val== poll.val){
                    while (tailNode.next!=null){
                        tailNode=tailNode.next;
                    }
                    poll.next=tailNode.next;
                    tailNode.next=poll;
                    pollnext.next=tailNode.next;
                    tailNode.next=pollnext;
                    queue.poll();
                    while (tailNode.next!=null){
                        tailNode=tailNode.next;
                    }
                }else{
                    poll.next=tailNode.next;
                    tailNode.next=poll;
                }

            }


        }

        return newHead.next;
    }
}

你可能感兴趣的:(Java数据结构与算法,链表,算法,数据结构)