删除链表的中间节点和a/b处节点

原创 2016年06月01日 16:10:05

[说明]:

  本文是左程云老师所著的《程序员面试代码指南》第二章中“删除链表的中间节点和a/b处节点中的一道题目。

  在此感谢左程云老师。

[题目]:

  给定链表的头节点 head,实现删除链表的中间节点的函数。

  例如:

  步删除任何节点;

  1->2,删除节点1;

  1->2->3,删除节点2;

  1->2->3->4,删除节点2;

  1->2->3->4-5,删除节点3;

[进阶]:

  给定链表的头节点 head、整数 a 和 b,实现删除位于 a/b 处节点的函数。

  例如:

  链表:1->2->3->4->5,假设 a/b 的值为 r。

  如果 r = 0,不删除任何节点;

  如果 r 在区间 (0,1/5] 上,删除节点 1;

  如果 r 在区间 (1/5,2/5] 上,删除节点 2;

  如果 r 在区间 (2/5,3/5] 上,删除节点 3;

  如果 r 在区间 (3/5,4/5] 上,删除节点 4;

  如果 r 在区间 (4/5,1] 上,删除节点 5;

  如果 r 大于 1,不删除任何节点。

 [思路]:

  对于删除中间节点的问题:根据题意可知,链表长度每增加2(3,5,7......),要删除的节点就后移一个节点。设定两个指针,一个指针每次向前走一步,另一个向前走两步。

  对于删除 a/b 节点问题:((double) (a * n)) / (double) b  向上取整之后的整数值代表该删除的节点是第几个节点。

       仔细体会链表里的思想,还是蛮不错的。

package zcy_2;

public class RemoveNodeByRatio {

	public static class Node {
		public int value;
		public Node next;

		public Node(int data) {
			this.value = data;
		}
	}

	public static Node removeMidNode(Node head) {
		if (head == null || head.next == null) {
			return head;
		}
		if (head.next.next == null) {
			return head.next;
		}
		Node pre = head;
		Node cur = head.next.next;
		while (cur.next != null && cur.next.next != null) {
			pre = pre.next;
			cur = cur.next.next;
		}
		pre.next = pre.next.next;
		return head;
	}

	public static Node removeByRatio(Node head, int a, int b) {
		if (a < 1 || a > b) {
			return head;
		}
		int n = 0;
		Node cur = head;
		while (cur != null) {
			n++;
			cur = cur.next;
		}
		n = (int) Math.ceil(((double) (a * n)) / (double) b);
		if (n == 1) {
			head = head.next;
		}
		if (n > 1) {
			cur = head;
			while (--n != 1) {
				cur = cur.next;
			}
			cur.next = cur.next.next;
		}
		return head;
	}

	public static void printLinkedList(Node head) {
		System.out.print("Linked List: ");
		while (head != null) {
			System.out.print(head.value + " ");
			head = head.next;
		}
		System.out.println();
	}

	public static void main(String[] args) {
		Node head = new Node(1);
		head.next = new Node(2);
		head.next.next = new Node(3);
		head.next.next.next = new Node(4);
		head.next.next.next.next = new Node(5);
		head.next.next.next.next.next = new Node(6);

		printLinkedList(head);
		
		head = removeMidNode(head);
		printLinkedList(head);
		head = removeByRatio(head, 2, 5);
		printLinkedList(head);
		head = removeByRatio(head, 1, 3);
		printLinkedList(head);

	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

删除链表中的中间节点和 a/b 处的结点 Python 版

题目: 给定一个链表的头结点 head,实现删除链表中的中间节点的函数。 例如:给定链表[1, 5, 12, 33, 45, 171, 999, 1001, 2000],删除结点 45, 给定链...

链表问题(2)-- 删除聊表的中间节点和a/b处的节点

要求: 给定链表的头节点head,实现删除链表的中间节点的函数。例如: 链表:1->2->3->4->5,假设a/b的值为r; 如果r = 0,不删除任何节点; 如果r 在区间(0,1/5]上...

左程云_算法与数据结构 — 链表问题 — 03删除链表的中间节点和a/b处的节点

问题描述给定链表的头节点head,实现删除链表的中间节点的方法; 若为偶数个:比如1234则删除节点2; 给定链表的头节点head,实现删除链表的a/b处节点的方法;思路分析删除中间节点1个节点,...

左神的书——《程序员代码面试指南》之删除链表的中间节点或a/b节点 c++实现

//题目一: //给定链表的头节点head,实现删除链表的中间节点的函数。 //例如: //不删除任何节点; //1->2,删除节点1: //1->2->3,删除节点2; //1->2->...

单链表的创建,表长,插入,查找,逆置,中间元素,删除节点,打印

直接上代码。。。 #include #include using namespace std; struct Node { int data; Node *next; }; /*  type...

查找单链表的中间节点

  • 2011年05月17日 16:44
  • 2KB
  • 下载

007 算法:从单链表中删除一个中间节点

原文连接:http://www.pixelstech.net/article/1446199844-Algorithm-%3A-Delete-middle-node-from-singly-linke...

线性表---单链表(创建、找中间节点、删除头元素)

#include #include using namespace std;typedef struct node { int num; struct node *next; }Nod...
  • will130
  • will130
  • 2015年10月17日 20:50
  • 362

删除链表a/b处的节点(链表)

删除链表a/b处的节点,比如链表1、2、3、4、5 如果a/b=r; 如果0 如果1/5 如果2/5 如果3/5 如果4/5 【提示】 得到我们需要删除链表的第几个的值...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:删除链表的中间节点和a/b处节点
举报原因:
原因补充:

(最多只允许输入30个字)