在单链表中查找值为x的节点,单链表指针怎么指向上一节点

首页 > 经验 > 作者:YD1662022-11-04 00:44:00

通过编码实现日常关于链表可能会遇到到编程题

1 两个链表是各自自增的,要求合拼之后的链表满足单调不递减

/** * 两个递增的单链表合并保持单调递增 * * 递归求解 * @param firstNode * @param secondNode * @return */ public Node mergeNode(Node firstNode,Node secondNode){ if (firstNode==null)return secondNode; if (secondNode==null)return firstNode; Node mergeNode = null; if (firstNode.data<secondNode.data){ mergeNode = firstNode; mergeNode.next = mergeNode(firstNode.next,secondNode); } else { mergeNode = secondNode; mergeNode.next = mergeNode(firstNode,secondNode.next); } return mergeNode; }

2 单链表排序

/** * 单链表排序 * 归并排序 */ public Node sortNode(Node head){ if(head == null|| head.next == null){ return head; } Node mid = middleNode(head); Node right = sortNode(mid.next); mid.next = null; Node left = sortNode(head); return merge(left, right); } /** * 合拼排好序的子链表 * @param n1 * @param n2 * @return */ private Node merge(Node n1,Node n2){ Node dummy = new Node(0); Node node = dummy; while (n1!=null&&n2!=null) { if(n1.data<n2.data){ node.next = n1; n1 = n1.next; }else{ node.next = n2; n2 = n2.next; } node = node.next; } if(n1!=null){ node.next = n1; }else{ node.next = n2; } return dummy.next; } /** * 寻找链表中间值 * @param head * @return */ private Node middleNode(Node head){ Node slow = head; Node fast = head.next; while(fast!=null&fast.next!=null){ slow = slow.next; fast = fast.next.next; } return slow; }

3 单链表整体反转

/** * 递归方式-进行反转 * @param node * @return */ private Node reverseNodeByDG(Node head){ if(head.next == null){ return head; } Node reverseNode = reverseNodeByDG(head.next); head.next.next = head; head.next = null; return reverseNode; } /** * 遍历方式-进行反转 * @param node * @return */ private Node reverseNodeByBL(Node node){ Node prev = null; while(node!=null){ Node tmp = node.next; node.next = prev; prev = node; node = tmp; } return prev; }

4 单链表从n到m位置的反转

/** * 翻转链表的n到m之间的节点 */ Node reverseFromNTOM(Node head,int m,int n){ if(m>=n||head == null){ return head; } Node dummy = new Node(0); dummy.next = head; head = dummy; for(int i = 1;i<m;i ){ if(head == null){ return null; } head = head.next; } Node pmNode = head; Node mNode = head.next; Node nNode = mNode; Node pnNode = mNode.next; for(int i = m;i<n;i ){ if(pnNode == null){ return null; } Node tmp = pnNode.next; pnNode.next = nNode; nNode = pnNode; pnNode = tmp; } pmNode.next = nNode; mNode.next = pnNode; return dummy.next; }

5 单链表根据指定值进行分割

/** * 单链表分区 * 小于x的结点排在大于或等于x的结点之前 */ public Node nodePartition(Node head,int x){ if(head == null){ return null; } Node left = new Node(0); Node right = new Node(0); Node leftNode = left; Node rightNode = right; while(head!=null){ if(head.data<x){ left.next = head; left = head; }else{ right.next = head; right = head; } head = head.next; } left.next = rightNode.next; right.next = null; return leftNode.next; }

公众号分类整理了各种资料快去看看吧

在单链表中查找值为x的节点,单链表指针怎么指向上一节点(1)

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.