链表类
/**
*题目:实现链表
*时间:2015年8月26日09:39:31
*文件:LinkNode.java
*作者:cutter_point
*/
package bishi.Offer50.y2015.m08.d26;
public class LinkNode
{
public int m_nValue;
public LinkNode m_pNext;
public LinkNode()
{
}
public LinkNode(int d)
{
m_nValue = d;
m_pNext = null;
}
public LinkNode(int data, LinkNode next)
{
this.m_nValue = data;
this.m_pNext = next;
}
}
/**
*题目:实现链表
*时间:2015年8月26日09:39:31
*文件:LinkNode.java
*作者:cutter_point
*/
package bishi.Offer50.y2015.m08.d26;
import bishi.Offer50.y2015.m08.d26.LinkNode;
import java.util.Stack;
public class LinkList
{
private LinkNode head; //头结点
public LinkList()
{
//构造函数创建头结点
head = new LinkNode();
}
/**
* 在链表末尾添加一个节点
* @param data
*/
public void addTail(int data)
{
LinkNode newNode = new LinkNode(data);
if(head == null || head.m_pNext == null)
{
if(head == null)
{
head = new LinkNode();
}
head.m_pNext = newNode;
}//if
else
{
LinkNode p = head.m_pNext;
while(p.m_pNext != null)
{
p = p.m_pNext;
}//while
p.m_pNext = newNode;
}//else
}
/**
* 移除链表中的第一个data
* @param data
* @throws Exception
*/
public int removeNode(int data) throws Exception
{
if(head == null)
return -1;
LinkNode p = head, q = p.m_pNext;
while(q != null)
{
if(q.m_nValue == data)
break;
else
{
p = q;
q = q.m_pNext;
}//else
}//while
if(q == null)
throw new Exception("找不到数据");
p.m_pNext = q.m_pNext;
q.m_pNext = null;
return q.m_nValue;
}
/**
* 在链表中找到第一个出现data的位置,是链表中的第几个节点(包括头结点)
* @param data
* @return
*/
public LinkNode findNode(int data)
{
LinkNode p = head;
while(p != null)
{
if(p.m_nValue == data)
{
break;
}//if
else
{
p = p.m_pNext;
}//else
}//while
if(p == null)
{
return null;
}//if
return p;
}
public LinkNode getHead()
{
return head;
}
public int getLength()
{
if(head == null)
return 0;
LinkNode p = head;
int len = 0;
while(p.m_pNext != null)
{
p = p.m_pNext;
++len;
}//while
return len;
}
/**
* 我们借助栈,逆序打印链表
* @param link
*/
public static void PrintListReversingly_Iteratively(LinkList link)
{
if(link == null || link.head == null)
return;
if(link.head != null && link.head.m_pNext == null)
return;
Stack<LinkNode> nodes = new Stack<LinkNode>();
LinkNode p = link.head.m_pNext;
while(p != null)
{
nodes.push(p);
p = p.m_pNext;
}//while
while(!nodes.empty())
{
p = nodes.pop();
System.out.print(p.m_nValue + "\t");
}//while
}
/**
* 逆序输出我们链表
* @param pHead
*/
public static void PrintListReversingly_Recursively(LinkNode pHead)
{
if(pHead != null)
{
if(pHead.m_pNext != null)
{
PrintListReversingly_Recursively(pHead.m_pNext);
}//if
System.out.print(pHead.m_nValue + "\t");
}//if
}
public static void main(String[] args)
{
LinkList link = new LinkList();
link.addTail(8);link.addTail(7);link.addTail(6);link.addTail(5);link.addTail(4);link.addTail(3);
link.addTail(2);link.addTail(1);link.addTail(0);link.addTail(-1);link.addTail(-2);link.addTail(-3);
PrintListReversingly_Iteratively(link);
System.out.println();
PrintListReversingly_Recursively(link.head);
}
}
求第一个公共节点类
我们可以先遍历两个数组的长度,然后如果长度不一样,我们由于后面的节点两个链表的后半部分是一样的,那么我们只要把多的那个多走几步,然后找到相同的节点就可以了
/****************************************************************************************
*题目:两个链表的第一个公共结点
* 输入两个链表,找出他们的第一个公共结点。链表结构定义如下:
* class ListNode
* {
* int m_nKey;
* ListNode m_pNext;
* }
*时间:2015年10月3日15:34:19
*文件:FirstCommonNodesInLists.java
*作者:cutter_point
****************************************************************************************/
package bishi.Offer50.y2015.m10.d03;
import bishi.Offer50.y2015.m08.d26.*;
public class FirstCommonNodesInLists
{
public LinkNode findFirstCommonNode(LinkList link1, LinkList link2)
{
int length1 = link1.getLength(); //第一歌链表的长度
int length2 = link2.getLength(); //第二个链表的长度
//我们两个链表的差别就是没有合并的前面那一段,合并之后的节点都是一样的,因为没有next指针分开了
//那么我们可以求出长度的差值,然后进行相应的遍历就可以位移到相应的节点
int diflen = length1 - length2;
LinkNode longNode = link1.getHead().m_pNext; //由于我们的链表规定,设定了头节点(空的节点)
LinkNode shortNode = link2.getHead().m_pNext;
if(length1 < length2)
{
//如果是链表2比较长的话就要反过来
diflen = length2 - length1;
longNode = link2.getHead().m_pNext;
shortNode = link1.getHead().m_pNext;
}//if
//根据这个长度差异,我们把比较长的链表先进行一定的位移
for(int i = 0; i < diflen; ++i)
{
longNode = longNode.m_pNext;
}//for
//然后进行同时遍历,因为长的链表已经先进行了一部分位移
while(longNode != null && shortNode != null && longNode != shortNode)
{
longNode = longNode.m_pNext;
shortNode = shortNode.m_pNext;
}//while
//这两个节点已经同步到公共节点了
LinkNode comm = longNode;
return comm;
}
@org.junit.Test
public void Test()
{
LinkList link = new LinkList();
link.addTail(8);link.addTail(7);link.addTail(6);link.addTail(5);link.addTail(4);link.addTail(3);
LinkList link2 = new LinkList();
link2.addTail(2);link2.addTail(1);link2.addTail(0);link2.addTail(-1);link2.addTail(-2);link2.addTail(-3);
FirstCommonNodesInLists f = new FirstCommonNodesInLists();
System.out.println(f.findFirstCommonNode(link, link2));
}
}