24. 两两交换链表中的节点
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func swapPairs(head *ListNode) *ListNode {
dummyNode := &ListNode{
Next: head,
}
cur := head
pre := dummyNode
for cur != nil && cur.Next != nil{
tmp := cur.Next.Next
pre.Next = cur.Next //第一步交换
cur.Next.Next = cur //第二步交换
cur.Next = tmp //第三步交换
pre = cur
cur = cur.Next
}
return dummyNode.Next
}
19. 删除链表的倒数第 N 个结点
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummyNode := &ListNode{
Next: head,
}
//fast先前进n+1次
slow,fast := dummyNode,dummyNode
for i:=0 ; i<=n ; i++{
fast = fast.Next
}
for fast != nil{
fast = fast.Next
slow = slow.Next
}
slow.Next = slow.Next.Next
return dummyNode.Next
}
面试题 02.07. 链表相交
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
countA, countB := 0,0
a,b := headA,headB
for headA != nil{
headA = headA.Next
countA++
}
for headB != nil{
headB = headB.Next
countB++
}
//得到链表AB的长度
diff := countA - countB
if(diff > 0){
for diff != 0{
diff--
a = a.Next
}
}
if(diff < 0){
for diff != 0{
diff++
b = b.Next
}
}
for a != nil{
if(a == b){
return a
}
a = a.Next
b = b.Next
}
return nil
}
142.环形链表II
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func detectCycle(head *ListNode) *ListNode {
fast,slow := head,head
a := head
for fast != nil && fast.Next != nil{
fast = fast.Next.Next
slow = slow.Next
if(fast == slow){//找到交点
for a != fast{
a,fast = a.Next,fast.Next
}
return a
}
}
return nil
}
总结:142 for循环的条件不能对调… 在这里卡了很久… go的底层还是要再看一下,其余的都做过 感觉思路比较清晰